最小邮票数(01背包)
题目描述
有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值。 如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分、3分、4分即可。
输入描述:
有多组数据,对于每组数据,首先是要求凑成的邮票总值M,M<100。然后是一个数N,N〈20,表示有N张邮票。接下来是N个正整数,分别表示这N张邮票的面值,且以升序排列。
输出描述:
对于每组数据,能够凑成总值M的最少邮票张数。若无解,输出0。
示例1
输入
复制
10 5 1 3 3 3 4
输出
复制
3
思路:只要我们优先考虑面值大的邮票,那么凑出来的邮票数量就会尽可能小。
所以,先按面值对邮票从大到小排序,然后按照01背包来解决问题即可,把总值看作背包容量,把邮票的面值看作物品的重量与价值,如果dp[m]==m,则证明能凑出来
#include<iostream>
#include<stack>
#include<vector>
#include<map>
#include<string.h>
#include<algorithm>
using namespace std;
const int maxn=110;
int num[maxn][maxn];//记录状态[i][v]时候的邮票数量
int dp[maxn];
int tickers[maxn];//邮票面值bool cmp(int x,int y){return x>y;}
int main(){int m,n;while(cin>>m){cin>>n;for(int i=1;i<=n;i++)cin>>tickers[i];sort(tickers+1,tickers+1+n,cmp);memset(num,0,sizeof(num));memset(dp,0,sizeof(dp));for(int i=1;i<=n;i++){for(int v=m;v>=tickers[i];v--){if(dp[v] < dp[v-tickers[i]] + tickers[i]){dp[v] = dp[v-tickers[i]] + tickers[i];num[i][v]=num[i-1][v-tickers[i]]+1;}else{num[i][v]=num[i-1][v];}}}if(dp[m]==m){//能凑出来cout<<num[n][m]<<endl;}else{cout<<0<<endl;}}
}
最小邮票数(01背包)相关推荐
- 九度 1209:最小邮票数(多重背包)
题目描述: 有若干张邮票,要求从中选取最少的邮票张数凑成一个给定的总值 如,有1分,3分,3分,3分,4分五张邮票,要求凑成10分,则使用3张邮票:3分.3分.4分即可 思路 1. 朴素背包问 ...
- 【nyoj-456】 邮票分你一半 (dp,0-1背包的中点问题)
题干: 邮票分你一半 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 小珂最近收集了些邮票,他想把其中的一些给他的好朋友小明.每张邮票上都有分值,他们想把这些邮票分成两份 ...
- 2017百度之星程序设计大赛 - 资格赛【1001 Floyd求最小环 1002 歪解(并查集),1003 完全背包 1004 01背包 1005 打表找规律+卡特兰数】...
度度熊保护村庄 Accepts: 13 Submissions: 488 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/3276 ...
- [01背包] 背包问题求具体方案(01背包+求方案数+思维)
文章目录 0. 前言 1. 01背包+求方案数+思维 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包+求方案数+思维 12. 背包问题求具体方案 求方案数也是背包问题.dp 的 ...
- 01背包,完全背包,多重背包,混合背包,二维费用背包,分组背包,背包问题求方案数
1 01背包问题 有 NNN 件物品和一个容量是 VVV 的背包.每件物品只能使用 一次. 第 iii 件物品的体积是 viv_ivi,价值是 wiw_iwi.求解将哪些物品装入背包,可使这些物品 ...
- [01背包] 数字组合(01背包+求方案数)
文章目录 0. 前言 1. 01背包求方案数 0. 前言 相关: [背包] 背包问题算法模板(模板) 1. 01背包求方案数 278. 数字组合 将 M 看作背包容量,每个数看成一个物品,Ai 看成是 ...
- qdu-凑数题(01背包)
Description 小Q手里有n(n<=1000) 个硬币,每枚硬币有一定的金额(200=>x>=1)他想知道,用这些硬币(每枚硬币只能用一次,但可能会有等面值的用两次) 能组成 ...
- dp之01背包hdu3466(带限制的,当你所拥有的钱数大于某个限定值时才可以购买该物品)...
题意:买东西,每个东西有三个特征值,p代表价格,q代表你手中钱必须不低于q才能买这个物品,v代表得到的价值. mark:又是变种01背包,每做一个变种的,就是一种提高.. 按照q - p以由大到小的顺 ...
- HDU 3466 01背包变形
给出物品数量N和总钱数M 对于N个物品.每一个物品有其花费p[i], 特殊值q[i],价值v[i] q[i] 表示当手中剩余的钱数大于q[i]时,才干够买这个物品 首先对N个物品进行 q-p的排序,表 ...
最新文章
- Linux上用户执行命令记录
- 一步一步制作yaffs/yaffs2根文件系统(三)---使用glibc库构造 /lib
- postgresql查询栅格数据范围(extent)
- mysql+零时数据结构,MySql主要索引数据结构
- wxWidgets:wxHyperlinkEvent类用法
- svn增量打包部署_持续集成、持续交付、持续部署(CI/CD)简介
- python 制作抽奖箱_用Excel函数制作抽奖箱
- 如何系统的自学python-如何系统的学习python?
- C# 如何将Excel表格复制到Word中并保留格式
- oracle 怎么清空数据表,oracle怎么清空表数据,oracle清空数据库
- MYSQL启动失败,Can‘t create test file
- selenium自动化图片不加载设置
- 【JavaScript】鼠标、键盘的基础事件
- LQA: Time of day is written with a “dot” not a “colon” (13.14 not 13:14)
- 苹果xr十大隐藏功能_网上找的一些非常实用的苹果笔记本使用技巧及隐藏功能,收藏了...
- html中嵌套谷歌定位地图
- PAP和CHAP认证是什么
- 与门、或门、非门、与非门、或非门、异或门、同或门
- Java web 服务器 搭建_搭建一个java web服务端
- 黑马程序员 网络编程2