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]);

ContractedBlock.gif ExpandedBlockStart.gif 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 }

转载于:https://www.cnblogs.com/tangcong/archive/2011/04/23/2025987.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值