zoukankan      html  css  js  c++  java
  • 完全背包&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背包是反着就好了!

  • 相关阅读:
    安装触摸板驱动导致系统无法开机
    TensorBoard的使用
    TensorFlow 编程基础
    在Anaconda3下安装(CPU版)TensorFlow(清华镜像源)
    C 程序
    CodeBlocks 断点调试
    数字图像处理之复原处理
    数字图像处理之频域图像增强
    数字图像处理之傅里叶变换
    算法导论中的四种基本排序
  • 原文地址:https://www.cnblogs.com/riced/p/13444872.html
Copyright © 2011-2022 走看看