包子凑数(蓝桥杯)

感谢:@ Statusrank

题目链接(点击)

题目描述

小明几乎每天早晨都会在一家包子铺吃早餐。他发现这家包子铺有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



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、完全背包)【背包问题】的更多相关文章

  1. 包子凑数(dp思想)

    问题描述: 小明几乎每天早晨都会在一家包子铺吃早餐.他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子.每种蒸笼都有非常多笼,可以认为是无限笼.每当有顾客想买X个包子,卖包子的大叔就会迅速选 ...

  2. DP大作战——多重背包

    题目描述 在之前的上机中,零崎已经出过了01背包和完全背包,也介绍了使用-1初始化容量限定背包必须装满这种小技巧,接下来的背包问题相对有些难度,可以说是01背包和完全背包的进阶问题. 多重背包:物品可 ...

  3. 水dp第二天(背包有关)

    水dp第二天(背包有关) 标签: dp poj_3624 题意:裸的01背包 注意:这种题要注意两个问题,一个是要看清楚数组要开的范围大小,然后考虑需要空间优化吗,还有事用int还是long long ...

  4. dp之多维背包hdu2159

    二维背包问题,我是觉得这个题目数据比较水,虽然它最后说了怪可以无限个,但是它却只能最多杀s个,也就是所有品种的怪最多为s个,那么就是二维完全背包的问题了.......同时,它没有说一定要杀s只怪,所以 ...

  5. c++_包子凑数

    标题:包子凑数 小明几乎每天早晨都会在一家包子铺吃早餐.他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子.每种蒸笼都有非常多笼,可以认为是无限笼. 每当有顾客想买X个包子,卖包子的大叔就会 ...

  6. Java实现第八届蓝桥杯包子凑数

    包子凑数 题目描述 小明几乎每天早晨都会在一家包子铺吃早餐.他发现这家包子铺有N种蒸笼,其中第i种蒸笼恰好能放Ai个包子.每种蒸笼都有非常多笼,可以认为是无限笼. 每当有顾客想买X个包子,卖包子的大叔 ...

  7. DP大作战—组合背包

    题目描述 组合背包:有的物品只可以取一次(01背包),有的物品可以取无限次(完全背包),有的物品可以取的次数有一个上限(多重背包). DD大牛的伪代码 for i = 1 to N if 第i件物品属 ...

  8. 树形DP(01组合背包The Ghost Blows Light HDU4276)

    题意:有n个房间,之间用n-1条道路连接,每个房间都有一个定时炸弹,在T时间后会一起爆炸,第i个房间有pi价值的珠宝,经过每条道路都需要花费一定的时间,一个人从1房间开始 ,从n房间出去,保证再不炸死 ...

  9. dp之二维背包poj1837(天平问题 推荐)

    题意:给你c(2<=c<=20)个挂钩,g(2<=g<=20)个砝码,求在将所有砝码(砝码重1~~25)挂到天平(天平长  -15~~15)上,并使得天平平衡的方法数..... ...

随机推荐

  1. 关于php中数据提交到当前页面action的问题

    关于php中数据提交到当前页面action的问题 2011-06-21 17:45杨超★杰伦 | 分类:PHP | 浏览695次 php中数据提交到当前页面,有人action=“<?php ec ...

  2. 每次找Internet选项感到抓狂?一键打开!

    WIN+R运行,输入inetcpl.cpl,就可以打开了!

  3. 利用Jackson封装常用JsonUtil工具类

    在日常的项目开发中,接口与接口之间.前后端之间的数据传输一般都是使用JSON格式,那必然会封装一些常用的Json数据转化的工具类,本文讲解下如何利用Jackson封装高复用性的Json转换工具类. 转 ...

  4. pdf去水印,pdf解密,pdf转MarkDown

    pdf去水印,在转Markdown文件 首先我们要有版权的敬畏之心,这里只是给大家介绍一下思路,请合理使用! 1.pdf去水印 下载:悦书PDF阅读器,注意免费免费!!!!(后期就不知道了,目前是免费 ...

  5. vue采用history路由的服务器部署问题

    发现部署问题 在部署的时候发现打开的页面是空白 之前部署原理 之前的页面都是作为静态文件形式打包上传到服务器上 http://www.xiedashuaige.cn/bolg2.0/#/home 就和 ...

  6. [JavaWeb基础] 025.JAVA把word转换成html

    用第三方插件POI把word文档转换成HTML,下面直接上代码 package com.babybus.sdteam.wordtopdf; import java.io.BufferedWriter; ...

  7. [Objective-C] 004_继承封装与多态

    继承 面向对象编程 (OOP) 语言的一个主要功能就是"继承".继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展.通过继承创建的 ...

  8. Linux实验

    实验一 Linux系统安装与简单配置 一.实验目的 1.掌握Linux系统安装的分区准备. 2.掌握Linux系统的安装步骤. 3.掌握Linux系统分区的挂载和卸载. 4.掌握Linux系统的启动和 ...

  9. flex布局以及常用属性。

    (1)flex布局排列 会消除块状属性,所有与块状相关的属性将失效,比如块状元素会独占一行,如图2,设置flex后会在一行排列

  10. Java实现 蓝桥杯 算法训练 数字三角形

    算法训练 数字三角形 时间限制:1.0s 内存限制:256.0MB 问题描述 (图3.1-1)示出了一个数字三角形. 请编一个程序计算从顶至底的某处的一条路 径,使该路径所经过的数字的总和最大. ●每 ...