hdu 2602 Bone Collector 01背包模板

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602

题目要求是尽量装的最多,所以初始化的时候都为0即可。

如果要求恰好装满,初始化的时候除了dp[0] = 0,其他都要设成-inf,表示不合法情况。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int T;
 4 int dp[1010][1010];
 5 int v[1010], w[1010];
 6 int main() 
 7 {
 8  //   freopen("in.txt", "r", stdin);
 9    // freopen("out.txt", "w", stdout);
10     scanf("%d", &T);
11     while(T--)
12     {
13         int N, V;
14         scanf("%d%d", &N, &V);
15         memset(dp, 0, sizeof(dp));
16         for(int i = 1; i <= N; i++) scanf("%d", &v[i]);
17         for(int i = 1; i <= N; i++) scanf("%d", &w[i]);
18         
19         for(int i = 1; i <= N; i++)
20         {
21             for(int j = 0; j <= V; j++)
22             {
23                 if(j >= w[i]) dp[i][j] = max(dp[i-1][j-w[i]]+v[i], dp[i-1][j]);
24                 else dp[i][j] = dp[i-1][j];
25             }
26         }
27         printf("%d
", dp[N][V]);
28         
29     }
30     return 0;
31 }

滚动数组:

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 int T;
 4 int dp[1010];
 5 int v[1010], w[1010];
 6 int main() 
 7 {
 8  //   freopen("in.txt", "r", stdin);
 9    // freopen("out.txt", "w", stdout);
10     scanf("%d", &T);
11     while(T--)
12     {
13         int N, V;
14         scanf("%d%d", &N, &V);
15         memset(dp, 0, sizeof(dp));
16         for(int i = 1; i <= N; i++) scanf("%d", &v[i]);
17         for(int i = 1; i <= N; i++) scanf("%d", &w[i]);
18         
19         for(int i = 1; i <= N; i++)
20         {
21             for(int j = V; j >= w[i]; j--)
22             {
23                 dp[j] = max(dp[j-w[i]]+v[i], dp[j]);
24             }
25         }
26         printf("%d
", dp[V]);
27         
28     }
29     return 0;
30 }
原文地址:https://www.cnblogs.com/titicia/p/5355016.html