DP-01揹包
阿新 • • 發佈:2020-11-05
01揹包習慣上寫成一維陣列優化的形式:
1 for(int i=1;i<=n;i++) 2 { 3 for(int c=m;c>=0;c--) 4 { 5 if(c>=w[i]) 6 f[c]=max(f[c],f[c-w[i]]+v[i]); 7 } 8 }模板
//外層列舉每個物品,內層列舉空間
例題:
P1060 開心的金明:https://www.luogu.org/problem/P1060
1 #include<cstdio> 2 #include<iostream> 3 4 usingP1060namespace std; 5 6 int f[50005], v[50], w[50]; 7 8 int main(){ 9 int n, m; 10 scanf("%d%d", &n, &m); 11 for(int i = 1; i <= m; i++){ 12 scanf("%d%d", &v[i], &w[i]); 13 w[i] *= v[i]; 14 } 15 for(int i = 1; i <= m; i++){ 16 for(int j = n; j >= v[i]; j--){17 if(j >= v[i]){ 18 f[j] = max(f[j], f[j-v[i]]+w[i]); 19 } 20 } 21 } 22 printf("%d\n", f[n]); 23 return 0; 24 }
P1164 小A點菜:https://www.luogu.org/problem/P1164
取決於小A第i道菜是否要:
若錢充足,辦法總數就等於吃這道菜的辦法數與不吃這道菜的辦法數之和;
若不充足,辦法總數就只能承襲吃前i-1道菜的辦法總數