题目地址 http://acm.hdu.edu.cn/showproblem.php?pid=2602
题目分析:因为是骨头,只能取整个的,因此属于动态规划里面的0-1背包类型。动态规划里面的0-1背包问题的核心代码有三种形式,其中最优化的是滚动数组的方法,其缺点也是明显的,其在打印方案时比较困难,因为只有最后一个阶段的状态值。但是本题不需要进行打印方案,所以可以用此方法。、
AC代码如下:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1100;
int T,N,V;
int val[maxn]={0},vol[maxn]={0};
int f[maxn][maxn]={0},dp[maxn]={0};
int main(){
int i,j;
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&V);
memset(val,0,sizeof(val));
memset(vol,0,sizeof(vol));
memset(dp,0,sizeof(dp));
//memset(f,0,sizeof(f));
for(i=1;i<=N;i++)
scanf("%d",&val[i]);
for(i=1;i<=N;i++)
scanf("%d",&vol[i]);
for(i=0;i<=N;i++)
for(j=0;j<=N;j++)
f[i][j]=0;
for(i=1;i<=N;i++){
for(j=V;j>=0;j--){
if(j>=vol[i])
dp[j]=max(dp[j],dp[j-vol[i]]+val[i]);
}
}
printf("%d\n",dp[V]);
}
return 0;
}