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 }

 

 

你可能感兴趣的:(Collector)