From 50d451b5fffa3640dfb198c4c834bbdbac7fd79b Mon Sep 17 00:00:00 2001 From: unknown Date: Thu, 1 Oct 2020 00:23:59 +0530 Subject: [PATCH] Add standard dp questions --- src/coin change - minimum number of coins.cpp | 51 +++++++++++++++++++ src/coin change - number of ways.cpp | 29 +++++++++++ src/count number of subsets with sum = k.cpp | 42 +++++++++++++++ ...inimum subset sum difference iterative.cpp | 40 +++++++++++++++ ...inimum subset sum difference recursive.cpp | 30 +++++++++++ ...given score by some numbers distinctly.cpp | 27 ++++++++++ src/subset sum - dp.cpp | 44 ++++++++++++++++ src/unbounded Knapsack.cpp | 32 ++++++++++++ 8 files changed, 295 insertions(+) create mode 100644 src/coin change - minimum number of coins.cpp create mode 100644 src/coin change - number of ways.cpp create mode 100644 src/count number of subsets with sum = k.cpp create mode 100644 src/minimum subset sum difference iterative.cpp create mode 100644 src/minimum subset sum difference recursive.cpp create mode 100644 src/reach a given score by some numbers distinctly.cpp create mode 100644 src/subset sum - dp.cpp create mode 100644 src/unbounded Knapsack.cpp diff --git a/src/coin change - minimum number of coins.cpp b/src/coin change - minimum number of coins.cpp new file mode 100644 index 0000000..612a42f --- /dev/null +++ b/src/coin change - minimum number of coins.cpp @@ -0,0 +1,51 @@ +//https://practice.geeksforgeeks.org/problems/number-of-coins/0/ + +//2D dp +#include +using namespace std; +int main(){ + int t; + cin>>t; + while(t--){ + int sum,n; + cin>>sum>>n; + vector v(n); + for(auto &itr:v) cin>>itr; + int dp[n+1][sum+1]; + for(int j=0;j<=sum;j++) dp[0][j] = INT_MAX - 1; + for(int i=0;i<=n;i++) dp[i][0] = 0; + for(int i=1;i<=n;i++){ + for(int j=1;j<=sum;j++){ + if(j>=v[i-1]){ + dp[i][j] = min(1 + dp[i][j-v[i-1]],dp[i-1][j]); + } + else dp[i][j] = dp[i-1][j]; + } + } + if(dp[n][sum] == INT_MAX - 1) cout<<-1<>n>>sum; +vector v(n); +for(auto &itr:v) cin>>itr; +ll dp[sum+1]; +for(ll i=0;i<=sum;i++) dp[i] = INT_MAX-1; +dp[0]=0; + +for(ll i=1;i<=sum;i++){ + for(ll j=1;j<=n;j++){ + if(i>=v[j-1]) + dp[i] = min(1+ dp[i-v[j-1]] , dp[i]); + } +} +if(dp[sum]==INT_MAX-1) cout<<-1; +else +cout< +using namespace std; +int main(){ + int t; + cin>>t; + while(t--){ + int n; + cin>>n; + int sum; + vector v(n); + for(auto &itr:v) cin>>itr; + cin>>sum; + int dp[n+1][sum+1]; + for(int j=0;j<=sum;j++) dp[0][j]=0; + for(int i=0;i<=n;i++) dp[i][0]=1; + for(int i=1;i<=n;i++){ + for(int j=1;j<=sum;j++){ + if(j>=v[i-1]){ + dp[i][j] = dp[i][j-v[i-1]] + dp[i-1][j]; + } + else dp[i][j] = dp[i-1][j]; + } + } + cout< +using namespace std; +vector v; +int n; +int main(){ + int t; + cin>>t; + while(t--){ + v.clear(); + cin>>n; + for(int i=0;i>temp; + v.push_back(temp); + } + int k; + cin>>k; + int sum=k; + int dp[n+5][sum+5]; + + for(int j=0;j<=sum;j++) dp[0][j]=0; + for(int i=0;i<=n;i++) dp[i][0]=1; + int cnt=0; + for(int i=1;i<=n;i++){ + for(int j=1;j<=sum;j++){ + + if((j-v[i-1])>=0){ + dp[i][j] = (dp[i-1][j-v[i-1]] + dp[i-1][j]); + //only change or of subset sum to + here to count the number of subsets + + + } + else{ + dp[i][j] = dp[i-1][j]; + } + } + } + cout< + +using namespace std; + +int main(){ + int t; + cin>>t; + while(t--){ + int n; + cin>>n; + vector v(n); + for(auto &itr:v) cin>>itr; + int fullsum=0; + for(auto ele:v) fullsum+=ele; + + int sum=fullsum/2; + bool dp[n+5][(sum)+5]; + for(int j=0;j<=sum;j++) dp[0][j]=false; + for(int i=0;i<=n;i++) dp[i][0]=true; + + for(int i=1;i<=n;i++){ + for(int j=1;j<=sum;j++){ + if(j-v[i-1]>=0){ + dp[i][j] = dp[i-1][j-v[i-1]] or dp[i-1][j]; + } + else dp[i][j] = dp[i-1][j]; + } + } + int s1; + for(int j=0;j<=sum;j++){ + if(dp[n][j]) s1=j; + } + + cout<<(fullsum - s1) - s1< + +using namespace std; + +int dp[55][10001]; +int arr[200001]; +int solve(int ind,int x,int y,int n){ + if(ind==n) return abs(x-y); + + if(dp[ind][y]!=-1) return dp[ind][y]; + + return dp[ind][y]=min(solve(ind+1,x+arr[ind],y,n),solve(ind+1,x,y+arr[ind],n)); + +} + + +int main() { + int t; + cin>>t; + while(t--){ + int n; + cin>>n; + for(int i=0;i>arr[i]; + memset(dp,-1,sizeof(dp)); + cout< +using namespace std; +int dp[1001][10]; +int solve(int arr[],int n,int i){ + if(i<0 or n<0) return 0; + if(n==0) return 1; + if(dp[n][i]!=-1) return dp[n][i]; + + return dp[n][i] = solve(arr,n-arr[i],i) + solve(arr,n,i-1); + +} + +int main(){ + int t; + cin>>t; + while(t--){ + int n; + cin>>n; + memset(dp,-1,sizeof(dp)); + int arr[3] = {3,5,10}; + cout< +using namespace std; +vector v; +int n; +int main(){ + int t; + cin>>t; + while(t--){ + v.clear(); + cin>>n; + for(int i=0;i>temp; + v.push_back(temp); + } + int sum=0; + for(auto ele:v) sum+=ele; + if(sum&1) { + cout<<"NO"<0){ + dp[i][j] = (dp[i-1][j-v[i-1]] | dp[i-1][j]); + } + else{ + dp[i][j] = dp[i-1][j]; + } + } + } + + if(dp[n][sum]) cout<<"YES"< +using namespace std; + +int main(){ + int t; + cin>>t; + while(t--){ + int n,w; + cin>>n>>w; + + vector v(n); + for(auto &itr:v) cin>>itr; + vector wt(n); + for(auto &itr:wt) cin>>itr; + int dp[n+5][w+5]; + for(int i=0;i<=n;i++) dp[i][0]=0; + for(int j=0;j<=w;j++) dp[0][j]=0; + for(int i=1;i<=n;i++){ + for(int j=1;j<=w;j++){ + if(j>=wt[i-1]){ + //only one change from 0/1 Knapsack which is that if we take the item then we can again take it so v[i-1] + dp[i][j-wt[i-1]] + // i.e. in 0/1 Knapsack -- if 5,6,4,8 is the value array we can take 8 and move to arr with end 4 so dp[i-1][j-wt[i-1]] + // in Unbounded Knapsack -- if 5,6,4,8 is the value array we can take 8 and stay at arr with end 8 as again we can take 8 so dp[i][j-wt[i-1]] + dp[i][j] = max((v[i-1] + dp[i][j-wt[i-1]]),dp[i-1][j]); + } + else dp[i][j] = dp[i-1][j]; + } + } + cout<