首页 > 编程语言 >周六900C++班级-2022-11-26-完全背包

周六900C++班级-2022-11-26-完全背包

时间:2022-11-27 09:34:17浏览次数:42  
标签:11 900 背包 int max C++ 01 物品 dp

完全背包定义

有N种物品和一个容量为V的背包,每种物品都有无限件可用。第i种物品的体积是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。

从定义中可以看出,与01背包的区别01背包最多只能拿一件物品,完全背包则不然,只要空间够多,一种物品我可以拿n件!

01背包的状态转移方程为:dp(i,j)=max(dp(i-1,j),dp(i-1,j-w[i])+v[i])
完全背包的状态转移方程:dp(i,j)=max(dp(i-1,j),dp(i,j-w)+v[i])

我们可以看出,完全背包的动态转移方程max中第二项为i,而不是i-1。

为什么呢?

 

 

我从代码的角度阐释一下这个问题!
注意我们现在并没有对dp数组进行降维!
我们的j是从0开始的,依次递增这个是完全背包的关键,也是与01背包本质的区别
dp[i][j]=max(dp[i-1][j],dp[i][j-w[i]]+v[i]);
首先要满足完全背包的动态转移方程,就要先知道dp(i,j-w)的大小
正好我们是从0开始的,并不是从后往前,也就是当求到dp(i,j)时
dp(i,j-w),在前面已经求过!!!
所以我们可以应当理顺的求出dp(i,j)而不再是向01背包要考虑前i-1时候的状态!

 

完全背包的优化

然后我们根据01背包的优化原则对,完全背包进行优化!
优化后的动态方程
dp[j]=max(dp[j],dp[j-w]+v)

#include<bits/stdc++.h>
using namespace std;
int dp[30005]; //dp[j] = 最大容量为j时的最大价值
int n,m;
int w[105],v[105];//w重量,v价值 
int main()
{
    cin>>m>>n;
    for(int i=1;i<=n;i++)cin>>w[i]>>v[i];
    for(int i=1;i<=n;i++)
    {
        for(int j=w[i];j<=m;j++)
        {    //dp[j] = dp[j] , dp[j-w[i]]+v[i]
            dp[j] = max(dp[j],dp[j-w[i]]+v[i]);  
        }
    }
    cout<<dp[m];
    return 0;
}

 

标签:11,900,背包,int,max,C++,01,物品,dp
From: https://www.cnblogs.com/jyssh/p/16929004.html

相关文章

  • C++游戏角色的方向,速度,坐标
    游戏开发基础   角色的方向,速度,坐标1.方向(8个方向) 8个方向的图片2.速度   x,y变化后的位置3坐标  x,y当前的位置......
  • 字符串模式匹配算法 C++
    #include<iostream>#include<vector>#include<string>usingnamespacestd;//处理模式串,每一个位置都赋值为已匹配的位数vector<int>next_pos(stringpattern){ ......
  • golang_learn note_2022年11月26日
    D:\code_gitee\go_example\main.gopackagemainimport( "fmt")funcmain(){ //显示声明类型 constastring="hello" //隐式声明类型 constb="hello"......
  • C++:类继承知识回顾
    概述  在实际代码开发中,我们通常不会去开发最底层,而是成为“调库侠”。面对众多类库,我们需要掌握基本库的用法,比如string、valarray、iostream、any等,本白在开发capl测......
  • 11.26(P)
    函数的传参:  如果使用函数时不传入参数则使用默认参数值rt    *表明参数被改为元组类型,可以传入无限个参数  即:z在函数传参定义了一个个字典元素......
  • 11-多态的优势和弊端
    多态的优势多态的弊端问题:当转换类型不一致时怎么办解决方法:利用instanceof关键字进行判断java-jdk14新特性,将其简化小结......
  • leetcode-1175-easy
    leetcode-1175-easyReturnthenumberofpermutationsof1tonsothatprimenumbersareatprimeindices(1-indexed.)(Recallthatanintegerisprimeifand......
  • leetcode-110-easy
    BalancedBinaryTreeGivenabinarytree,determineifitisheight-balanced.Example1:Input:root=[3,9,20,null,null,15,7]Output:trueExample2:Input......
  • 【流水】2022.11.26
    今天没有什么想说的,主要就是玩上午主要推东方,看视频下午主要打MC再加上一堆三角符文这不是RPG啊,这是模拟经营!RPG不动产(其实还推了一个小时高级局扫雷,很多局都输......
  • C++ 使用文件流写/读文本文件、二进制文件、按指定格式写/读文本文件
    1.使用文件流写文本文件:#include<iostream>#include<string>#include<fstream>usingnamespacestd;intmain(){stringname;intage;ofs......