动态规划
0-1背包问题(递归+备忘录)
#include<iostream>
using namespace std;
const int N=3; //物品种类
const int W=5; //背包重量
int w[N+1]={0,1,2,3}; //物品重量
int v[N+1]={0,6,12,10}; //物品价值
int memory[N+1][W+1];
int max(int a,int b) {
return a>b?a:b;
}
int dp(int N,int W){
if(memory[N][W]!=0)//使用备忘录
return memory[N][W];
if(N==0||W==0)//初始化
return 0;
if(W>=w[N])//装物品
memory[N][W]=max(dp(N-1,W),dp(N-1,W-w[N])+v[N]);
else//不装物品
memory[N][W]=dp(N-1,W);
return memory[N][W];
}
void print(int a[][W+1]){
for(int i=0;i<=N;i++){
for(int j=0;j<=W;j++)
cout<<a[i][j]<<"\t";
cout<<endl;
}
}
int main(){
cout<<dp(N,W)<<endl;
print(memory);
return 0;
}