1. 程式人生 > 實用技巧 >DP-01揹包

DP-01揹包

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 using
namespace 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 }
P1060

P1164 小A點菜:https://www.luogu.org/problem/P1164

取決於小A第i道菜是否要:

若錢充足,辦法總數就等於吃這道菜的辦法數與不吃這道菜的辦法數之和;

若不充足,辦法總數就只能承襲吃前i-1道菜的辦法總數