OJ:L3-001 凑零钱 DFS
解题报告-L3-001-凑零钱
韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有 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
解题思路
- 按照要求的最小序列,可以知道硬币的面值需要排序,而且按照DFS搜索的顺序肯定能找到最小序列。
- n的数量明显大过m,为了时间短,肯定只取前面的10^2个value
- 一开始没有充分利用value已经排序好的特性来剪枝,导致还是需要深入空搜很多层:后面进行了改进。
- “全部加起来还不够”:反正又不难写,判断一下呗~实际上最后一个TLE就是因为这个。
代码
一开始,最后一个case TLE
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <cmath>
#include <cstdio>
#include <bitset>
using namespace std;static int n, m;
static int curr;
static int* value;
static bool* isUsed;bool dfs(int in){ // before index inif(in == n) return curr == m;if(curr + value[in] == m){ // succeedisUsed[in] = true;return true;}else{if(curr + value[in] < m){isUsed[in] = true;curr += value[in];bool ok = dfs(in + 1);if(ok) return true;else{isUsed[in] = false;curr -= value[in];}}return dfs(in + 1);}
}int main(){cin >> n >> m;curr = 0;value = new int[n];isUsed = new bool[n];for(int i=0; i<n; i++){scanf("%d", &value[i]);isUsed[i] = false;}sort(value, value+n);if(n > 100) n = 100;bool ok = dfs(0);if(ok){bool flag = true;for(int i=0; i<n; i++){if(isUsed[i]){if(flag) flag = false;else printf(" ");printf("%d", value[i]);}}}else cout << "No Solution";return 0;
}
AC代码
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
#include <stack>
#include <queue>
#include <vector>
#include <cmath>
#include <cstdio>
#include <bitset>
using namespace std;static int n, m;
static int curr;
static int* value;
static bool* isUsed;bool dfs(int in){ // before index in// curr will forever < mif(in == n) return curr == m;if(curr + value[in] == m){ // succeedisUsed[in] = true;return true;}else if(curr + value[in] > m) return false;else{isUsed[in] = true;curr += value[in];bool ok = dfs(in + 1);if(ok) return true;else{ // isUsed[in] = falseisUsed[in] = false;curr -= value[in];return dfs(in + 1);}}
}int main(){cin >> n >> m;curr = 0;value = new int[n];isUsed = new bool[n];for(int i=0; i<n; i++){scanf("%d", &value[i]);isUsed[i] = false;}sort(value, value+n);if(n > 100) n = 100;// sum of value < m?int tmp = 0;for(int i=0; i<n; i++) tmp += value[i];if(tmp < m){cout << "No Solution";return 0;}// judge and outputif(dfs(0)){bool flag = true;for(int i=0; i<n; i++){if(isUsed[i]){if(flag) flag = false;else printf(" ");printf("%d", value[i]);}}}else cout << "No Solution";return 0;
}
OJ:L3-001 凑零钱 DFS相关推荐
- python整钱兑换零钱_使用Python完成收集变更的问题(DFS idea),凑,零钱,dfs,思想
使用Python完成凑零钱问题(dfs思想) 题目描述 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手 ...
- L3-001 凑零钱(dfs+玄学剪枝=AC)
题目链接:L3-001 凑零钱 梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有 10^4 枚 ...
- L3-001. 凑零钱(dfs + 各种剪枝)
L3-001. 凑零钱 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现 ...
- PAT 团体程序设计天梯赛-练习集 题解(凑零钱,堆栈,社交集群)
开始准备cccc(cry)天梯赛了,第一周训练题,把官网挂出的训练题刷完了,对pat有了一点点的熟悉感. L1-1 就不说了... L1-2 打印沙漏 一个变量保存空格数,一个变量保存沙漏符号数,打 ...
- L3-001 凑零钱 深搜
L3-001 凑零钱 (30 分) 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有 104 ...
- 【CCCC】L3-001 凑零钱 (30分),,01背包路径打印
problem L3-001 凑零钱 (30分) 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有 ...
- L3-001. 凑零钱
L3-001. 凑零钱 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现 ...
- 凑零钱问题_凑零钱的组合
给定K种面值c1,c2,....ck,每种金币数量,例举总和为amount的,至少需要的金币的组合 关于计算金币数量有解法,金币组合方式可以参考,暴力解,从小到大,找到即是最小组合 import ja ...
- 凑零钱-dynamic programming
凑零钱 (30 分) 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有 10(4)(下同没改哈哈哈 ...
最新文章
- MongoDB[mark]总忘记它们是干啥的
- 图文讲解,团队开发中的 Git 最佳实践
- Caused by: java.net.BindException: Could not start rest endpoint on any port in port range 8085
- Git commit后,本地代码丢失解决方法
- 局域网只看到少数电脑_利用局域网高速传输大文件的两种方法
- BUFF 在C++ 中取其中一部分 并且写到固定的目录下
- c语言浮点型常量表示平均数_数据类型与常量、变量解析
- OpenGL基础49:高度贴图(下)
- iptables记录日志
- channel代码示例
- 【短视频运营】短视频制作流程 ( 视频存稿 | 写脚本 | 拍摄收音 | 提词器 | 后期剪辑 | 前测工具 | 检查违禁词 )
- 几何算法合集(3D)
- 中国世界500强数量首超美国,但别高兴得太早
- 2022年度总结:除旧迎新,继往开来!
- win10网页找不到服务器dns,win10无法找到dns地址是怎么回事|win10无法找到dns地址如何解决...
- ubuntu下使用vscode开发golang程序,从控制台到简单web程序
- 一些代码静态检查工具的简介
- 有效年利率 EAR effective annual return
- 中国区块链标准建设分析
- 利用谱聚类和随机分块(SBM)来做网络模型中的社区发现