题目链接:
HDU 2602 Bone Collector
注意:
单个背包的重量和总容量允许为0。
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <climits>
using namespace std;
const int MAX_N=1010;
int T,n,v;
int val[MAX_N],cost[MAX_N],dp[MAX_N];
int main()
{
//freopen("hdu2602in.txt","r",stdin);
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&v);
for(int i=1;i<=n;i++){
scanf("%d",&val[i]);
}
for(int i=1;i<=n;i++){
scanf("%d",&cost[i]);
}
memset(dp,0,sizeof(dp));
/*
//set: dp[MAX_N][MAX_N] 78MS 5404K
for(int i=1;i<=n;i++){
for(int j=0;j<=v;j++){
if(j<cost[i]) dp[i][j]=dp[i-1][j];
else dp[i][j]=max(dp[i-1][j],dp[i-1][j-cost[i]]+val[i]);
//printf("dp[%d][%d]=%d\n",i,j,dp[i][j]);
}
}
*/
//set: dp[MAX_N] 滚动数组 31MS 1416K
for(int i=1;i<=n;i++){
for(int j=v;j>=cost[i];j--){
dp[j]=max(dp[j],dp[j-cost[i]]+val[i]);
}
}
printf("%d\n",dp[n][v]);
}
return 0;
}