01背包问题(动态规划)

Posted helloworld2019

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

技术图片

 

以上是关于01背包问题(动态规划)的主要内容,如果未能解决你的问题,请参考以下文章

动态规划问题3--多重背包

动态规划之01背包问题(含代码C)

动态规划-第二节:动态规划之背包类型问题

动态规划本质理解:01背包问题

动态规划背包问题总结

分别用回溯法和动态规划求0/1背包问题(C语言代码)