典型的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]);


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 }
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 }