題目鏈接: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;
}