01揹包與完全揹包的例題
阿新 • • 發佈:2020-09-14
01揹包
例題洛谷P1048
程式碼:
#include<iostream> using namespace std; int T,M; int W[105],V[105],dp[1005]; int main(){ cin>>T>>M; for(int i=1;i<=M;i++){ cin>>W[i]>>V[i]; } for(int i=1;i<=M;i++){ for(int j=T;j>=W[i];j--){ dp[j]=max(dp[j-W[i]]+V[i],dp[j]); } } cout<<dp[T]; return 0; }
完全揹包
程式碼區別在於for的第二重迴圈條件反過來就好
例題洛谷P1616
#include <iostream> #include<algorithm> #include<cstdio> #include<vector> #include<queue> #include<stack> #include<cstring> using namespace std; int t,m,w,v; long long dp[10000005]; int main(){ cin >> t >> m; for(int i=1;i<=m;i++){ cin>>w>>v; for(int j=w;j<=t;j++){ dp[j]=max(dp[j],dp[j-w]+v); } } cout<<dp[t]<<endl; return 0; } // freopen("testdata.in", "r", stdin);
補充:動態規劃可以做一些統計方案數的題目
例題洛谷P1164
#include <iostream> #include<algorithm> #include<cstdio> #include<vector> #include<queue> #include<stack> #include<cstring> using namespace std; int N,M; int a[105]; int dp[10005]={1}; int main(){ cin>>N>>M; for(int i=1;i<=N;i++){ cin>>a[i]; } for(int i=1;i<=N;i++){ for(int j=M;j>=a[i];j--){ dp[j]=dp[j]+dp[j-a[i]]; } } cout<<dp[M]<<endl; return 0; } // freopen("testdata.in", "r", stdin);