题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2602
中文题目:
思路:
代码:
#include <iostream>
#include <algorithm>
using namespace std;
int recode[1000][1000]{0};
int value[1000];//价值
int v[1000];//体积
int cases,nums,bagv;
int resolve(int i,int remainV);
int main(){
cin>>cases;
while (cases--){
cin>>nums>>bagv;
for(int i = 0;i<nums;i++)
scanf("%d",&value[i]);
for(int i = 0;i<nums;i++)
scanf("%d",&v[i]);
memset(recode,0, sizeof(recode));//重置记忆化数组
printf("%d\n",resolve(0,bagv));
}
return 0;
}
int resolve(int i,int remainV){
if (recode[i][remainV] != 0)
return recode[i][remainV];
int res;
if(i == nums){//物品已经选择完毕,这一轮就没有新的价值
res = 0;
} else if(v[i]>remainV){ //此物品在剩余的背包空间放不下
res = resolve(i+1,remainV);
} else{
res = max(resolve(i+1,remainV),resolve(i+1,remainV-v[i])+value[i]);//取放与不放的最大价值
}
return recode[i][remainV] = res;
}