给出骨头的个数,及每个骨头的价值,体积,背包的容量,求该该背包容量下能装的最大价值;
这是一道传统的01背包题,用dp[i][j]表示把前i个物品装到容积为j的背包中的最大容量,那么对第i个物品有两个决策,装或不装。此时的状态转移方程为dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i])
代码实现如下:
#include<stdio.h>
#include<string.h>
const int Max=1000;
int w[Max+10],v[Max+10];
int dp[Max+10][Max+10];
int main(){
int t;
scanf("%d",&t);
while(t--){
int N,V;
scanf("%d%d",&N,&V);
memset(dp,0,sizeof(dp));
for(int i=1;i<=N;i++)
scanf("%d",&w[i]);
for(int i=1;i<=N;i++)
scanf("%d",&v[i]);
for(int i=1;i<=N;i++){
for(int j=0;j<=V;j++){
dp[i][j]=dp[i-1][j];
if(j>=v[i]&&dp[i][j]<dp[i-1][j-v[i]]+w[i])
dp[i][j]=dp[i-1][j-v[i]]+w[i];
}
}
/*for(int i=1;i<=N;i++){
for(int j=0;j<=V;j++)
printf("%d ",dp[i][j]);
printf("\n");
}*/
printf("%d\n",dp[N][V]);
}
return 0;
}