zoukankan      html  css  js  c++  java
  • 算法温习动态规划之01背包问题

    01背包问题不再详述,百度之。

    先给出01背包的递推式如下:

    f[i][j]:表示把前i个物品放入承重为j的背包中得到的最大价值。

    f[i][j]=max((f[i-1][j-w[i]+p[i]),f[i-1][j])   (j>=w[i])

    f[i][j]=f[i-1][j]    (j<w[i])

    其实就是讨论第i个物品放不放入背包中,两种情况,看哪中情况得到的价值大

    第一种情况:f[i-1][j-w[i]]+p[i] 表示把第i个物品放入背包中,那么该背包的价值增加p[i],但是,由于放入了w[i]的重物,背包承重能力减少w[i],该问题显然可以用递归解决,自顶向下,(我们看这个递归是的时候用自顶向下的眼光看,比较容易理解,如果从下往上推导,有点难理解)也更简单。

    第二种情况:f[i-1][j]表示不放入第i个物品,承重不变

    代码如下:

    #include<vector>
    #include<iostream>
    using namespace std;
    
    int main()
    {
        int n=0,m=0;
        cin>>n>>m;
        vector<int> w(n);
        vector<int> p(n);
    
        int f[10][10]={0};
    
        cout<<"请输入重量and价值:";
        for (int i=0;i<n;i++)
        {
            cin>>w[i];
            cin>>p[i];
        }
        
        for (int i=1;i<=n;i++)
        {
            for (int j=1;j<=m;j++)
            {
                if (j<w[i])
                {
                    f[i][j]=f[i-1][j];
                }
                else if(f[i-1][j-w[i]]+p[i] > f[i-1][j])
                {
                    f[i][j]=f[i-1][j-w[i]]+p[i];
                }
                else f[i][j]=f[i-1][j];
            }
        }
        cout<<f[n][m]<<endl;
    
        return 0;
    }
  • 相关阅读:
    Android深度探索读书笔记 第四章
    Android深度探索读书笔记 第三章
    Android深度探索读书笔记 第二章
    Android深度探索第九章
    Android深度探索第十章
    Android深度探索第八章
    第六章
    第七章
    第五章
    第四章
  • 原文地址:https://www.cnblogs.com/sqxw/p/4466718.html
Copyright © 2011-2022 走看看