HDU 2602 Bone Collector (dp问题之01背包)

地址:http://acm.hdu.edu.cn/showproblem.php?pid=2602

思路:dp问题之01背包

代码如下:一维的,我习惯的作风。。。

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #define N 1001
 5 int dp[N];
 6 int c[N],w[N];
 7 int max(int x,int y)
 8 {
 9     return x>y?x:y;
10 }
11 int main()
12 {
13     int t,n,v,i,j;
14     scanf("%d",&t);
15     while(t--)
16     {
17         scanf("%d%d",&n,&v);
18         for(i=0;i<n;i++)
19           scanf("%d",&c[i]);
20         for(i=0;i<n;i++)
21           scanf("%d",&w[i]);
22         memset(dp,0,sizeof(dp));
23         for(i=0;i<n;i++)
24         {
25             for(j=v;j>=w[i];j--)
26               dp[j]=max(dp[j],dp[j-w[i]]+c[i]);
27         }
28         printf("%d\n",dp[v]);
29     }
30     system("pause");
31     return 0;
32 }
33     

 

 

代码如下:二维的。。。不太习惯。。。不建议用

 1 //二维数组实现01背包
 2 #include <iostream>
 3 #include <algorithm>
 4 using namespace std;
 5 int dp[1001][1001],vol[1001],val[1001];
 6 int main()
 7 {
 8     int t,n,i,j,v;
 9     cin>>t;
10     while(t--)
11     {
12         cin>>n>>v;
13         for(i=1;i<=n;i++)
14             scanf("%d",&val[i]);
15         for(i=1;i<=n;i++)
16             scanf("%d",&vol[i]);
17         memset(dp,0,sizeof(dp)); //初始化
18         for(i=1;i<=n;i++)
19             for(j=0;j<=v;j++) //注意要从0开始,这个题测试数据有点变态,有的骨头有价值,但占的空间是0
20             {
21                 if(vol[i]<=j && dp[i-1][j]<dp[i-1][j-vol[i]]+val[i])
22                     dp[i][j]=dp[i-1][j-vol[i]]+val[i];
23                 else
24                     dp[i][j]=dp[i-1][j];
25             }
26         cout<<dp[n][v]<<endl;
27     }
28     return 0;
29 }

 

 

posted on 2012-08-22 09:56  mycapple  阅读(373)  评论(0编辑  收藏  举报

导航