Bone Collector

典型的01背包问题,百度百科里面有很好的解释,我就不多说了,状态转移方程,dp[i][j],i表示bone数量,j表示体积,dp[i][j]表示数量i,体积j骨头的最大价值,dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]);

View Code
1 #include<stdio.h>
2 #include<string.h>
3 #include<stdlib.h>
4  //#include<debug.h>
5 int A[1010][1002],c[1010],v[1010];
6 int max(int x,int y)
7 {
8 return x>y?x:y;
9 }
10 int main( )
11 {
12 int N;
13 //Debug( );
14 scanf("%d",&N);
15 while(N--)
16 {
17 int T,V,i,j;
18 memset(A,0,sizeof(A));
19 memset(c,0,sizeof(c));
20 memset(v,0,sizeof(v));
21 scanf("%d%d",&T,&V);
22 for(i=1;i<=T;i++)
23 scanf("%d",&c[i]);
24 for(i=1;i<=T;i++)
25 scanf("%d",&v[i]);
26 for(i=1;i<=T;i++)
27 for(j=0;j<=V;j++)
28 {
29 if(j>=v[i])
30 A[i][j]=max(A[i-1][j],A[i-1][j-v[i]]+c[i]);
31 else
32 A[i][j]=A[i-1][j];
33 }
34 printf("%d\n",A[T][V]);
35 }
36 return 0;
37 }

posted on 2011-04-23 23:54  more think, more gains  阅读(205)  评论(0编辑  收藏  举报

导航