01背包(模板)
01背包
n种物品,没种的重量为W,价值为V,背包容量为C,求在不超过C的情况下能装入的最大价值;
测试数据:
5 10
2 6
2 3
6 5
5 4
4 6
Answer: 15
第一种是用一维数组表示的:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 int n,C; 8 struct node 9 { 10 int W,V; 11 }maze[10]; 12 int dp[20]; //dp[j] 用一位数组表示:当剩余容量为j时,当前的最大价值. 13 14 int main() 15 { 16 while(scanf("%d%d",&n,&C)!=EOF) 17 { 18 for(int i=0;i<n;i++) 19 { 20 scanf("%d%d",&maze[i].W,&maze[i].V); 21 } 22 memset(dp,0,sizeof(dp)); 23 for(int i=0;i<n;i++) 24 { 25 for(int j=C;j>=maze[i].W;j--) 26 dp[j] = max(dp[j-maze[i].W]+maze[i].V,dp[j]); 27 } 28 printf("%d",dp[C]); 29 } 30 return 0; 31 }
第二种是用二维数组表示的,相对第一种耗空间小点:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<algorithm> 5 using namespace std; 6 7 int n,C; 8 struct node 9 { 10 int W,V; 11 }maze[10]; 12 int dp[20][20]; // dp[i][j] 拿第i件物品,剩余容量为j时的最大价值. 13 14 int main() 15 { 16 while(scanf("%d%d",&n,&C)!=EOF) 17 { 18 for(int i=1;i<=n;i++) //不能写for(int i=0;i<n;i++),这样会导致少算一个数,因为后边的i-1 19 { 20 scanf("%d%d",&maze[i].W,&maze[i].V); 21 } 22 memset(dp,0,sizeof(dp)); 23 for(int i=1;i<=n;i++) 24 { 25 for(int j=1;j<=C;j++) 26 { 27 if(maze[i].W>j) 28 dp[i][j] = dp[i-1][j]; 29 else 30 dp[i][j] = max(dp[i-1][j-maze[i].W]+maze[i].V,dp[i-1][j]); 31 } 32 } 33 printf("%d",dp[n][C]); 34 } 35 return 0; 36 }