01背包问题(动态规划)

描述:
n个重量价值为wi,vi的物品,从这些物品中挑出重量不超过w的物品,求挑选方案中价值和最大值
1=<n<=100
1=<wi,vi<=100
1=<=W<=10000
输入:4
2 3 1 2 3 4 2 2
5
输出:
7
#include<iostream>
using namespace std;
int const maxn=1000;
int n,W;
int w[maxn],v[maxn];
int rec(int i,int j){
    int res;
    if(i==n){
        res=0;
    }else if(j<w[i]){//无法挑选 
        res=rec(i+1,j);
    }else {
        res=max(rec(i+1,j),rec(i+1,j-w[i])+v[i]);
    }
    return res;
}
int main()
{
    cin>>n;
    int i;
    for(i=0;i<n;i++)  cin>>w[i]>>v[i];
    cin>>W;
//    rec(0,W);
    cout<<     rec(0,W)<<endl;
} 
View Code

优化后的代码:dp[][] 记录选还是不选时候的状态

//记忆化数组,优化 
#include<iostream>
using namespace std;
int const maxn=1000;
int n,W;
int w[maxn],v[maxn];
int dp[maxn][maxn]; 
int rec(int i,int j){
    if(dp[i][j]) return dp[i][j];
    int res;
    if(i==n){
        res=0;
    }else if(j<w[i]){//无法挑选 
        res=rec(i+1,j);
    }else {
        res=max(rec(i+1,j),rec(i+1,j-w[i])+v[i]);
    }
    return dp[i][j]=res;
}
int main()
{
    cin>>n;
    int i;
    for(i=0;i<n;i++)  cin>>w[i]>>v[i];
    cin>>W;
//    rec(0,W);
    cout<<     rec(0,W)<<endl;
} 
View Code

 

posted @ 2019-03-23 21:42  Hello_World2020  阅读(107)  评论(0编辑  收藏  举报