题解 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;
}
有心者可以将两段代码对比一下,即可发现两题是多么相似!!