解题报告-L3-001-凑零钱

韩梅梅喜欢满宇宙到处逛街。现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债。韩梅梅手边有 10​4​​ 枚来自各个星球的硬币,需要请你帮她盘算一下,是否可能精确凑出要付的款额。

输入格式:

输入第一行给出两个正整数:N(≤10​4​​)是硬币的总个数,M(≤10​2​​)是韩梅梅要付的款额。第二行给出 N 枚硬币的正整数面值。数字间以空格分隔。

输出格式:

在一行中输出硬币的面值 V​1​​≤V​2​​≤⋯≤V​k​​,满足条件 V​1​​+V​2​​+…+V​k​​=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相关推荐

  1. python整钱兑换零钱_使用Python完成收集变更的问题(DFS idea),凑,零钱,dfs,思想

    使用Python完成凑零钱问题(dfs思想) 题目描述 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手 ...

  2. L3-001 凑零钱(dfs+玄学剪枝=AC)

    题目链接:L3-001 凑零钱 梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有 10^​4 ​​ 枚 ...

  3. L3-001. 凑零钱(dfs + 各种剪枝)

    L3-001. 凑零钱 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现 ...

  4. PAT 团体程序设计天梯赛-练习集 题解(凑零钱,堆栈,社交集群)

    开始准备cccc(cry)天梯赛了,第一周训练题,把官网挂出的训练题刷完了,对pat有了一点点的熟悉感. L1-1  就不说了... L1-2 打印沙漏 一个变量保存空格数,一个变量保存沙漏符号数,打 ...

  5. L3-001 凑零钱 深搜

    L3-001 凑零钱 (30 分) 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有 10​4​​  ...

  6. 【CCCC】L3-001 凑零钱 (30分),,01背包路径打印

    problem L3-001 凑零钱 (30分) 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有 ...

  7. L3-001. 凑零钱

    L3-001. 凑零钱 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 陈越 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现 ...

  8. 凑零钱问题_凑零钱的组合

    给定K种面值c1,c2,....ck,每种金币数量,例举总和为amount的,至少需要的金币的组合 关于计算金币数量有解法,金币组合方式可以参考,暴力解,从小到大,找到即是最小组合 import ja ...

  9. 凑零钱-dynamic programming

    凑零钱 (30 分) 韩梅梅喜欢满宇宙到处逛街.现在她逛到了一家火星店里,发现这家店有个特别的规矩:你可以用任何星球的硬币付钱,但是绝不找零,当然也不能欠债.韩梅梅手边有 10​(4)(下同没改哈哈哈 ...

最新文章

  1. MongoDB[mark]总忘记它们是干啥的
  2. 图文讲解,团队开发中的 Git 最佳实践
  3. Caused by: java.net.BindException: Could not start rest endpoint on any port in port range 8085
  4. Git commit后,本地代码丢失解决方法
  5. 局域网只看到少数电脑_利用局域网高速传输大文件的两种方法
  6. BUFF 在C++ 中取其中一部分 并且写到固定的目录下
  7. c语言浮点型常量表示平均数_数据类型与常量、变量解析
  8. OpenGL基础49:高度贴图(下)
  9. iptables记录日志
  10. channel代码示例
  11. 【短视频运营】短视频制作流程 ( 视频存稿 | 写脚本 | 拍摄收音 | 提词器 | 后期剪辑 | 前测工具 | 检查违禁词 )
  12. 几何算法合集(3D)
  13. 中国世界500强数量首超美国,但别高兴得太早
  14. 2022年度总结:除旧迎新,继往开来!
  15. win10网页找不到服务器dns,win10无法找到dns地址是怎么回事|win10无法找到dns地址如何解决...
  16. ubuntu下使用vscode开发golang程序,从控制台到简单web程序
  17. 一些代码静态检查工具的简介
  18. 有效年利率 EAR effective annual return
  19. 中国区块链标准建设分析
  20. 利用谱聚类和随机分块(SBM)来做网络模型中的社区发现

热门文章

  1. UDP是什么、及UDP和TCP的区别?
  2. CSS3之解决相邻border重合加粗问题
  3. 互联网公司招聘--华为--校园招聘程序员--2015年笔试题
  4. 接受BBC专访的四个细节,印证了华为掌舵人任正非的智慧
  5. HTML innerHTML 属性
  6. 为什么选择用 360 度评估
  7. 当可达鸭女孩拍毕业照:别让熬夜肝论文的黑眼圈留在青春的痕迹里(附毕业照拍摄攻略)
  8. 解读 8 位移位寄存器的设计
  9. 融合通信技术个人笔记
  10. 融合通信指挥调度平台介绍