zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Domain Model
    linux 后台运行命令
    morphia(3)-查询
    [八省联考2018] 劈配
    [BZOJ 3218] a+b Problem
    [学习笔记] KM算法
    [HNOI2013] 消毒
    [HNOI2014] 画框
    [HDU 6057] Kanade's convolution
    [模板] 任意模数多项式乘法
  • 原文地址:https://www.cnblogs.com/helloworld2019/p/10585798.html
Copyright © 2011-2022 走看看