當i<0時 maxValue =0其他情況 maxValue = max(getMax(bagWeight-w[i],i-1)+v[i] ,getMax(bagWeight,i-1)); AC代碼如下,int weight[MAX_W][MAX_N] 數組 便是 dp[i][j]#include<iostream>#include<cstdlib>#include<malloc.h>#include<algorithm>#include <memory.h>using namespace std;#define MAX_N 201#define MAX_W 5001 int w[MAX_N]; //物體重量 int v[MAX_N]; //物體價值 int n; //物體個數int m; //背包的最大重量 int weight[MAX_W][MAX_N]; //weight[i][j] 表示背包為i重量產品數為j 的最高價值 int getMax(int bagWeight,int i){ int value; if(i < 0) return 0; //沒有物品 if(weight[bagWeight][i] != -1){ value=weight[bagWeight][i]; //“備忘錄”,此前保存的最大值 } else if(i==0){ // 最后一個物品 if(bagWeight >= w[i])return v[i]; //買 else return 0; //買不起 } else if(i!=0 && bagWeight >= w[i]){ //動態規劃 value = max(getMax(bagWeight-w[i],i-1)+v[i] ,getMax(bagWeight,i-1)); } else { //同樣買不起 value = getMax(bagWeight,i-1); } weight[bagWeight][i] = value; //保存最大值 return value; //返回最大值} int main(){// freopen("2.txt","r",stdin); memset(weight,-1,sizeof(weight));// cout<< sizeof(weight); int maxValue=0; cin>>n>>m; for(int i=0;i<n;i++) cin>>w[i]>>v[i]; maxValue=getMax(m,n-1); cout<<maxValue; return 0; }
新聞熱點
疑難解答