PAT L3-001 凑零钱(01背包(布尔背包)+记录路径)
L3-001. 凑零钱
时间限制:200 ms
内存限制:65536 kB
代码长度限制:8000 B
判题程序:Standard
作者:陈越
韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有104枚来自各个星球的硬币,需要请你帮她盘算一下,是否可能精确凑出要付的款额。
输入格式:
输入第一行给出两个正整数:N(<=104)是硬币的总个数,M(<=102)是韩梅梅要付的款额。第二行给出N枚硬币的正整数面值。数字间以空格分隔。
输出格式:
在一行中输出硬币的面值 V1 <= V2 <= … <= Vk,满足条件 V1 + V2 + … + Vk = M。数字间以1个空格分隔,行首尾不得有多余空格。若解不唯一,则输出最小序列。若无解,则输出“No Solution”。
注:
我们说序列{A[1], A[2], …}比{B[1], B[2], …}“小”,是指存在 k >= 1 使得 A[i]=B[i] 对所有 i < k 成立,并且 A[k] < B[k]。
输入样例1:
8 9
5 9 8 7 2 3 4 1
输出样例1:
1 3 5
输入样例2:
4 8
7 2 4 3
输出样例2:
No Solution
问题分析
学长和窝说这是01背包的变种布尔背包…….
题意:给n个硬币,问能否组成价值m。
那该怎么设计状态呢?
我感觉就是01背包的思想。可以这样,第i个硬币能否组成m,如果第i个硬币可以组成m,那么状态dp[j-coin[i]肯定就为true,否则为false,即表示当前硬币不可达m。如果选第i个,那么问题就变成i-1个硬币组成v-coin[i]的问题,不选就是i-1个硬币组成v的问题。边界状态肯定是硬币价值为0啦,0对于m一定是可达的,所以要初始dp[0] = true;所以状态转移方程为
dp[i][j] = dp[i-1][j] | dp[i-1][j-coin[i]]; 或者简化为一维,
dp[j] = dp[j] | dp[j-coin[i]]; (0 <= i <= n-1, 0 <= j <= m)
剩下的就是路径记录问题了,只要记住当前状态是由哪个状态转移过来的即可,输出coin[i]
ok,接下来是AC code(^_^)
#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e4+3,M = 400;
bool path[N][M],dp[N];
int coin[N];
bool cmp(int a,int b){return a>b;
}int main()
{int n,m;cin>>n>>m;for(int i = 0; i < n; ++i){cin>>coin[i];}dp[0] = true; //m+0一定还可以组成m,即0这个数可达(边界状态)sort(coin,coin+n,cmp); //这里我们从大到小排序,方便输出,到后面如果有更小的方案会覆盖for(int i = 0; i < n; ++i){for(int j = m; j >= coin[i]; j--){
// dp[j] = dp[j]|dp[j-coin[i]];if(dp[j-coin[i]]){ // 如果当前选择当前硬币可组成mdp[j] = true;path[i][j] = true; //记录路径}}}if(dp[m]==false) cout<<"No Solution"<<endl;else{int i = n-1, j = m, flag = 0;while (i>=0&&j>=0){if(path[i][j]){ //当前状态可选if(flag==0) { printf("%d",coin[i]); flag = 1;}elseprintf(" %d",coin[i]);j -= coin[i]; //要清楚当前状态是怎么转移过来的}i--;}puts("");}return 0;
}
PAT L3-001 凑零钱(01背包(布尔背包)+记录路径)相关推荐
- UVA 624 CD(01背包,要记录路径)
题意: 有n张CD(n<=20),每张能播放的时长不同.给定一个时长限制t,挑出部分的CD使得总播放时间最长.顺便输出路径! 思路: 重点在输出路径,否则这题很普通.那就要用二维数组记录每个CD ...
- 【CCCC】L3-001 凑零钱 (30分),,01背包路径打印
problem L3-001 凑零钱 (30分) 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有 ...
- PAT 团体程序设计天梯赛-练习集 题解(凑零钱,堆栈,社交集群)
开始准备cccc(cry)天梯赛了,第一周训练题,把官网挂出的训练题刷完了,对pat有了一点点的熟悉感. L1-1 就不说了... L1-2 打印沙漏 一个变量保存空格数,一个变量保存沙漏符号数,打 ...
- L3-001. 凑零钱
L3-001. 凑零钱 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现 ...
- 经典背包问题 01背包+完全背包+多重背包
01 背包 有n 种不同的物品,每个物品有两个属性,size 体积,value 价值,现在给一个容量为 w 的背包,问最多可带走多少价值的物品. int f[w+1]; //f[x] 表示背包容量为x ...
- 7-2 凑零钱 (30 分)
韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有 10410 ^4104枚来自各个星球的硬币,需要请 ...
- L3-001 凑零钱(dfs+玄学剪枝=AC)
题目链接:L3-001 凑零钱 梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有 10^4 枚 ...
- ☆【UVA - 624 】CD(dp + 0-1背包 + 记录路径)
题干: You have a long drive by car ahead. You have a tape recorder, but unfortunately your best music ...
- 动态规划_背包问题(01背包 完全背包)
背包问题-多种物品 重量不同 价值不同. 你可以取最多重量不超过W的物品,问最大价值为多少? 01背包 01背包 指的是 有N个物品 每个物品的重量为W[ i ],价值为V[ i ],(每个物品只有一 ...
- L3-001. 凑零钱(dfs + 各种剪枝)
L3-001. 凑零钱 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现 ...
最新文章
- 双水泵轮换工作原理图_「物业管理工作」水泵维护保养规程
- 你曾经是那手握烙铁的少年
- php导出mongo日志,导出mongo库到本地
- sap 预制凭证与暂存凭证的区别
- ASP.NET MVC 整合 Spring.net(1)- Controller进容器
- 事实--思维导图笔记
- tess4j 注意事项
- pillow是python的图像处理标准库_详解Python图像处理库Pillow常用使用方法
- 微软MVC对架构的一点思考
- 敏捷开发任务看板_看板方法的进化论:从丰田精益方法到敏捷研发
- 问题六十八:BRDF——(着色模型(shading model)(1)——反射模型(reflection model)(3.2))
- Linux查询存储信息,查询存储系统信息 - OceanStor UltraPath for Linux 21.5.0 用户指南 02 - 华为...
- android中一些特殊字符的使用(如:←↑→↓等箭头符号)
- voip和rtc_VoIP语音通话研究【进阶篇(四):freeswitch+webrtc+sip.js的通话】
- gazebo仿真环境搭建+配置+小车运动仿真
- 四大险种之间有什么区别?理赔会冲突吗?
- http简介以及常见知识和http请求头,响应头,状态码,内容类型对照表分享(超实用)
- 【学习OpenCV4】案例1:Windows OpenCV C++语言开发环境搭建
- 牛客网SQL大厂面试真题(一)
- 13种Java核心技术