题解 P2639 【[USACO09OCT]Bessie的体重问题Bessie's We…】

· · 题解

其实刚开始做这道题时,我以为这和01背包不一样——毕竟只有体积而没有价值

但是——我再去想它和01背包有什么相同点时,我发现:只不过01背包是在体积满足时最大价值,而这道题是在体积满足时最大体积

那么问题来了:假如我们换个思路,将这道题的每个干草也赋予它自己的价值,那岂不是变得和01背包一模一样了??

nice~~

那我们赋予每一个干草的价值是什么呢??答案显而易见:就是它自己的体积!!

nice~~

上代码:(先看01背包的代码):

#include<iostream>
using namespace std;
int f[45001]={0},w[10001]/*价值*/,c[10001]/*重量*/,n,m;
int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>c[i]>>w[i];
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=m;j>=c[i];j--)
        {
            if(f[j-c[i]]+w[i]>f[j])
            f[j]=f[j-c[i]]+w[i];
        }
    }
    cout<<f[m];
    return 0;
}

然后再来本题AC代码:

#include<iostream>
using namespace std;
int f[45001]={0},w[10001]/*价值*/,c[10001]/*重量*/,n,m;
int main()
{
    cin>>m>>n;        //不同之处1:输入顺序变了
    for(int i=1;i<=n;i++)
    {
        cin>>c[i];
        w[i]=c[i];   //不同之处2:直接赋值而非输入!
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=m;j>=c[i];j--)
        {
            if(f[j-c[i]]+w[i]>f[j])
            f[j]=f[j-c[i]]+w[i];
        }
    }
    cout<<f[m];
    return 0;
}

有心者可以将两段代码对比一下,即可发现两题是多么相似!!