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 }
 

原文地址:https://www.cnblogs.com/cypblogs/p/10071825.html