1 条题解
-
0
自动搬运
来自洛谷,原作者为

青珹
←马上退役的蒟蒻一个搬运于
2025-08-24 21:39:56,当前版本为作者最后更新于2018-03-07 09:03:25,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
其实刚开始做这道题时,我以为这和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; }有心者可以将两段代码对比一下,即可发现两题是多么相似!!
- 1
信息
- ID
- 1682
- 时间
- 1000ms
- 内存
- 125MiB
- 难度
- 2
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者