菱纱梦

导航

算法温习动态规划之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;
}

 

posted on 2015-04-29 18:13  菱纱梦  阅读(311)  评论(0编辑  收藏  举报