• 完全背包&01背包


    完全背包
    前言:上篇suibi写到了01背包的正解(不知道的戳这
    完全背包,也是做选择,只不过有无穷件物品罢了所以完全背包只是在01背包上做亿一点点改动。
    看代码:


    #include<bits/stdc++.h>
    using namespace std;
    int bag,n,v[101],w[101],dp[1001];
    int main()
    {
    	scanf("%d%d",&bag,&n);
    	for(int i=1;i<=n;i++)scanf("%d%d",&v[i],&w[i]);
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=v[i];j<=bag;j++)
    		{
    			dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
    		}
    	}
    	cout<<dp[bag]<<endl;
    	return 0;
    }
    

    吃鲲
    看看,看看!


    #include<bits/stdc++.h>
    using namespace std;
    int bag,n,v[101],w[101],dp[1001];
    int main()
    {
    	scanf("%d%d",&bag,&n);
    	for(int i=1;i<=n;i++)scanf("%d%d",&v[i],&w[i]);
    	for(int i=1;i<=n;i++)
    	{
    		for(int j=bag;j>=v[i];j--)
    		{
    			dp[j]=max(dp[j],dp[j-v[i]]+w[i]);
    		}
    	}
    	cout<<dp[bag]<<endl;
    	return 0;
    }
    

    啥?没看出区别?你品,你细品……


    for(int j=v[i];j<=bag;j++)
    和
    for(int j=bag;j>=v[i];j--)
    

    wc**!两者之间只有这一点差别?假的吧?
    不,只要看一组数据,就是真的了。

    体积 价值
    2 2
    3 3
    4 11
    9 18
    背包容量:9
    如是01背包,肯定选一个9————人家2+3+4都没一个9大,肯定选9啊!
    但是完全背包两个4他不香吗?两个4才8空间却又22价值,这就是01与完全的差别。
    01背包反着枚是为了判重,反之,完全背包不用判重,所以就正着枚举了。

    结论:完全背包和01背包很像,你甚至不用理解,知道就好。

    记住,完全背包是正着,01背包是反着就好了!

  • 相关阅读:
    学习Python用来爬虫
    C# 校验帮助类-正则表达式
    关于网站使用异步请求以后浏览器源码查看不到数据导致百度抓取不到的问题解决方案
    Linq学习教程
    【jQuery】选择器
    【jQuery】初始化的三种方法
    【ueditor】api方法
    同步(Synchronous)和异步(Asynchronous)
    【postman】postman
    【mysql函数】FIND_IN_SET函数用法
  • 原文地址:https://www.cnblogs.com/riced/p/13444872.html
Copyright © 2020-2023  润新知