动态规划之 “完全背包“ ------P8646 [蓝桥杯 2017 省 AB] 包子凑数

文章目录


前言

今天讲一道蓝桥真题

需要的前置知识点是完全背包,如果对此知识点不懂可以点击此处了解代码随想录之完全背包

现在我们有了这个前置知识点后直接开始看题


一、例题

二、分析题意

其实这就是一个完全背包问题,每个物品可以无限次数的拿取,当然,一个纯的完全背包问题问的是一个j容量的背包在对于一些物品无限次拿取的时候最大价值为多少,这道题我们要求的不是最大价值,而是背包是否可以被装满,比如我的背包容量为5,如果dp5=5说明可以被装满,按照题目的意思就是可以凑出5这个数

那什么时候是INF无限个数呢?其实我们开数据范围就能知道,我们只需要开一个较大的dp数组即可

dp状态转移公式
dpj=max(dpj,dpj-value\[i]+valuei)

我们在求完全背包的问题,在遍历背包的时候一定是正序遍历的,因为一件物品可以多次拿取,如果这里还有疑惑,说明前置知识点并没有理解透彻,请点击前言部分的链接 学习完01背包一维dp完全背包问题后再解决此题目

三、代码示例

cpp 复制代码
#include<iostream>
using namespace std;
int n;
int value[110];
int dp[1000005];//背包容量为i能装的最大价值为dp[i]
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>value[i];
	}
	
	for(int i=1;i<=n;i++)//遍历物品
	{
		for(int j=value[i];j<=1000000;j++)//正序遍历背包 因为一件物品可以被多次拿取
		{
			dp[j]=max(dp[j],dp[j-value[i]]+value[i]);
		}
	}
	
	int ans=0;
	for(int i=1;i<=1000000;i++)
	{
		if(dp[i]==0||dp[i]!=i)
		{
			ans++;//记录凑不出数的个数
		}
	}
	
	if(ans>=500000)cout<<"INF";//如果有500000个数凑不出 那基本上就是无限了
	else
	{
		cout<<ans;//否则直接输出多少个数不可以被凑出
	}
	return 0;
}

总结

学习路线: 二维01背包-----一维01背包------完全背包

相关推荐
aichitang20241 分钟前
快乐泛函每一天:希尔伯特空间中的最佳逼近与正交投影定理
人工智能·考研·算法·ai·面试·泛函分析
淬炼之火6 分钟前
笔记:Visually-Guided Policy Optimization for Multimodal Reasoning
人工智能·笔记·算法·机器学习·语言模型·自然语言处理
一只QAQ8 分钟前
c++项目
java·c++·算法
学习星球12 分钟前
空天地一体化网络(NTN)深度解析:从Starlink D2C到3GPP NTN,卫星直连手机是如何实现的?
网络·人工智能·算法·智能手机·php
科技林总23 分钟前
提示词测评落地全流程
人工智能·算法
Chester_199935 分钟前
CSP202206C.角色授权
开发语言·数据结构·c++·蓝桥杯
晴天的雨.99242 分钟前
类和对象下(内部类,匿名对象,对象拷贝时的编译器优化)
开发语言·c++·算法
旖旎夜光1 小时前
LeetCode 238:除自身以外数组的乘积(前缀和) —— 题解
数据结构·c++·算法·leetcode·前缀和
一条大祥脚1 小时前
26杭电暑期第八场(后半)快读|快写|tarjan|路径DP|mex转化|扫描线|前缀和|二分图
数据结构·算法·tarjan·杭电多校·强联通分量·动态规划dp
奈斯先生Vector1 小时前
从“能调用”到“可运营”:AI Agent 进入多模型时代后的架构升级
java·javascript·数据库·人工智能·算法·架构·aigc