1 条题解

  • 0
    @ 2025-8-24 21:39:56

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar 青珹
    ←马上退役的蒟蒻一个

    搬运于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
    上传者