包子凑数(dp 0-1、完全背包)【背包问题】
包子凑数(蓝桥杯)
题目描述
小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子。每种蒸笼都有非常多笼,可以认为是无限笼。
每当有顾客想买X个包子,卖包子的大叔就会迅速选出若干笼包子来,使得这若干笼中恰好一共有X个包子。比如一共有3种蒸笼,分别能放3、4和5个包子。当顾客想买11个包子时,大叔就会选2笼3个的再加1笼5个的(也可能选出1笼3个的再加2笼4个的)。
当然有时包子大叔无论如何也凑不出顾客想买的数量。比如一共有3种蒸笼,分别能放4、5和6个包子。而顾客想买7个包子时,大叔就凑不出来了。
小明想知道一共有多少种数目是包子大叔凑不出来的。第一个例子:
2
4
5输出:
6
输入
第一行包含一个整数N。(1 <= N <= 100)
以下N行每行包含一个整数Ai。(1 <= Ai <= 100)输出
一个整数代表答案。如果凑不出的数目有无限多个,输出INF。
样例输入
2
4
6
样例输出INF
提示对于样例1,凑不出的数目包括:1, 2, 3, 6, 7, 11。
对于样例2,所有奇数都凑不出来,所以有无限多个。
思路:
题目说明了包子笼数假设有无限个 想到是完全背包(所有物品种类数假设有无限个)
补充:
1、0-1背包dp: (每种物品只有1个)
例题:
有重量分别为16 15 15 的三个物品 其价值分别为 30 25 25 要将他们装进承载重量最大为30的包中 计算最大价值是多少?(用dp解决这个问题)
s[i][j] 表示 遍历第i个物品 剩余背包容量为 j
代码如下:
#include<bits/stdc++.h>
using namespace std;
int w[5]={16,15,15},v[5]={30,25,25},dp[55][55];
int main()
{
int n=3,m=30,maxx=-100;
for(int i=0;i<n;i++){
for(int j=0;j<=m;j++){
if(j>=w[i]){
dp[i][j]=max(dp[i-1][j],dp[i-1][j-w[i]]+v[i]);
}
else{
dp[i][j]=dp[i-1][j];
}
if(dp[i][j]>maxx){ //或者是将判断删去 改为直接最后输出dp[n-1][m];
maxx=dp[i][j];
}
}
}
printf("%d\n",maxx);
return 0;
}
2、完全背包dp:
例题 :
重量分别为2 4 8 3价值分别为5 9 18 9 的四件物品 每种物品数量有无限个 背包容量为10 计算最大价值:
· 注意和0-1 背包的区别:
例如:有重量为2的物品, dp[i][2]的时候放了一件了,当dp[i][4]的时候,dp[i][4]=max(dp[i-1][4],dp[i][4-2]+w[i]) 最多放一件
代码如下:
#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
int dp[maxn][55];
int w[maxn+5],v[maxn+5];
int n,m;
int main()
{
int i,j,k;
while(~scanf("%d %d",&n,&m)){
memset(dp,0,sizeof(dp));
for(i=1;i<=n;i++){
scanf("%d %d",&w[i],&v[i]);
}
for(i=1;i<=n;i++){
for(j=0;j<=m;j++){
if(j>=w[i]){
dp[i][j]=max(dp[i-1][j],dp[i][j-w[i]]+v[i]);//注意和01背包的区别,这里是
dp[i][j-need[i]]+value[i]
}
else{
dp[i][j]=dp[i-1][j];
}
}
}
printf("%d\n",dp[n-1][m]);
}
return 0;
}
这个题和上面有点差别 没有价格的区别所以我开始就把物品重量当成价值 最后判断背包是否被填满 但是数目大了就会错误 不得不放弃 看了@ Statusrank的讲解才明白我想复杂了 链接(点击)
先遍历每个a[i] 然后将对应的dp值改变
往后再遍历的时候 直接dp[j]=dp[ j-a[i] ]
例如 :
a1=4,a2=5:前提 令dp[0]=1(下面解释为甚麽)
先遍历4 将 4和其倍数的值变为1 因为dp[j]=dp[ j-a[i] ]
当j=4时 dp[4]=dp[4-a[1]]=dp[0]=1;
再遍历5的时候会将5 的倍数变为1(同理)
同时 当j=9时: dp[9]=dp[9-a[2]]=dp[4]=1; 也会将其他5 和4组成的数的dp赋值为1
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int MAX=1e5;
int dp[MAX+5],a[105];
int main()
{
int n,count=0;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
if(a[i]%2==0){
count++;
}
}
if(count==n){
printf("INF\n");
}
else{
count=0;
dp[0]=1;
for(int i=0;i<n;i++){
for(int j=a[i];j<=MAX+5;j++){
dp[j]=max(dp[j],dp[j-a[i]]);
}
}
for(int i=1;i<MAX+5;i++){
if(dp[i]==0){
count++;
}
}
printf("%d\n",count);
}
return 0;
}
包子凑数(dp 0-1、完全背包)【背包问题】的更多相关文章
- 包子凑数(dp思想)
问题描述: 小明几乎每天早晨都会在一家包子铺吃早餐.他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子.每种蒸笼都有非常多笼,可以认为是无限笼.每当有顾客想买X个包子,卖包子的大叔就会迅速选 ...
- DP大作战——多重背包
题目描述 在之前的上机中,零崎已经出过了01背包和完全背包,也介绍了使用-1初始化容量限定背包必须装满这种小技巧,接下来的背包问题相对有些难度,可以说是01背包和完全背包的进阶问题. 多重背包:物品可 ...
- 水dp第二天(背包有关)
水dp第二天(背包有关) 标签: dp poj_3624 题意:裸的01背包 注意:这种题要注意两个问题,一个是要看清楚数组要开的范围大小,然后考虑需要空间优化吗,还有事用int还是long long ...
- dp之多维背包hdu2159
二维背包问题,我是觉得这个题目数据比较水,虽然它最后说了怪可以无限个,但是它却只能最多杀s个,也就是所有品种的怪最多为s个,那么就是二维完全背包的问题了.......同时,它没有说一定要杀s只怪,所以 ...
- c++_包子凑数
标题:包子凑数 小明几乎每天早晨都会在一家包子铺吃早餐.他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子.每种蒸笼都有非常多笼,可以认为是无限笼. 每当有顾客想买X个包子,卖包子的大叔就会 ...
- Java实现第八届蓝桥杯包子凑数
包子凑数 题目描述 小明几乎每天早晨都会在一家包子铺吃早餐.他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子.每种蒸笼都有非常多笼,可以认为是无限笼. 每当有顾客想买X个包子,卖包子的大叔 ...
- DP大作战—组合背包
题目描述 组合背包:有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包). DD大牛的伪代码 for i = 1 to N if 第i件物品属 ...
- 树形DP(01组合背包The Ghost Blows Light HDU4276)
题意:有n个房间,之间用n-1条道路连接,每个房间都有一个定时炸弹,在T时间后会一起爆炸,第i个房间有pi价值的珠宝,经过每条道路都需要花费一定的时间,一个人从1房间开始 ,从n房间出去,保证再不炸死 ...
- dp之二维背包poj1837(天平问题 推荐)
题意:给你c(2<=c<=20)个挂钩,g(2<=g<=20)个砝码,求在将所有砝码(砝码重1~~25)挂到天平(天平长 -15~~15)上,并使得天平平衡的方法数..... ...
随机推荐
- 接上一篇:vue零基础入门记录
上一篇的vue项目已经搭建运行了起来,我用惯了idea这里也用的idea打开的项目.貌似其他软件写前端更好. 打开项目的项目路径是这样的 写惯了后台,第一眼看的时候感觉这个项目路径很乱,后面才知道我们 ...
- Shone.Math开源系列2 — 实数类型(含分数和无理数)的实现
Shone.Math开源系列2 实数类型(含分数和无理数)的实现 作者:Shone 声明:原创文章欢迎转载,但请注明出处,https://www.cnblogs.com/ShoneSharp. 摘要: ...
- Python之字符串中是否包含子串的几种方法
#第一种方式 :in a='abcdaac' b='a' c='db' print(b in a) print(c in a) 预览结果 #第二种方式:count()方法 a='abcdefgab' ...
- 附件2:async/await
在实际开发中总会遇到许多异步的问题,最常见的场景便是接口请求之后一定要等一段时间才能得到结果,如果遇到多个接口前后依赖,那么问题就变得复杂.大家都一直在尝试使用更好的方案来解决这些问题.最开始只能利用 ...
- 赛艇表演 51nod提高组模拟试题
AC通道 题目描述 小明去某个地区观看赛艇比赛,这个地区共有n个城市和m条道路,每个城市都有赛艇比赛,在第i个 城市观看赛艇表演的价钱为ai, 去其他城市观看也需要支付赛艇表演的价格.任意两个城市之间 ...
- [Wireshark]_002_玩转数据包
通过前一篇文章,我们大概了解了Wireshark,现在可以准备好进行数据包的捕获和分析了.这一片我们将讲到如何使用捕获文件,分析数据包以及时间格式显示等. 1.使用捕获文件 进行数据包分析时,其实很大 ...
- 小工具之apk黑屏自动检测
在打包测试的时候经常发送给测试组之后,发现已进入游戏就黑屏,这个就浪费了测试组的精力,如果要测试多款产品的话,就会因为黑屏问题做很多无用功,这是程序就需要在发给测试的时候自己先测试产品会不会黑屏.同样 ...
- Java和NodeJS解析XML对比
Java解析XML 1.接收xml文件或者字符串,转为InputStream 2.使用DocumentBuilderFactory对象将InputStream转为document对象 Document ...
- 最短路径——Dijkstar算法
背景:本文是在小甲鱼数据结构教学视频中的代码的基础上,添加详细注释而完成的.该段代码并不完整,仅摘录了核心算法部分,结合自己的思考,谈谈理解. Dijkstar算法理解: Dijkstar算法的核心思 ...
- Spring boot Sample 009之spring-boot-web-thymeleaf
一.环境 1.1.Idea 2020.1 1.2.JDK 1.8 二.目的 spring boot 整合thymeleaf模板开发web项目 三.步骤 3.1.点击File -> New Pro ...


