PAT.Advanced.P1068
来源:互联网 发布:对网络攻防技术的认识 编辑:程序博客网 时间:2024/06/05 00:23
------> 原题链接 <-------
题意大概是有1w个硬币,店家只要精确数额(不多收也不找零)问能否凑出给出的数额。
做法就是暴力循环 + 剪枝优化
不剪枝的话有一个点是过不去的。
1、剔除所有大于给定数量的硬币,
2、对于重复的硬币,如果第一个不行,那么排除掉后面所有的重复硬币的可能性。(见注释的核心剪枝行)
#include <iostream>#include <cstdio>#include <vector>#include <algorithm>int amount;int n;int coins[10000];using namespace std;vector<int> path;int compare_ints(const void* a, const void* b) // comparison function{ int arg1 = *reinterpret_cast<const int*>(a); int arg2 = *reinterpret_cast<const int*>(b); if(arg1 < arg2) return -1; if(arg1 > arg2) return 1; return 0;}bool find(int start, int target){ for (int i = start; i < n; i++) { if(coins[i] > target){ return false; } if(coins[i] == target) { path.push_back(i); return true; } if(coins[i] < target){ path.push_back(i); if(find(i + 1, target - coins[i])) return true; else path.pop_back(); while(i < n && coins[i] == coins[i+1]) i++; //这一句是核心的剪枝,如果没有这一行最后一个case就会超时。 } } return false;}int main(){int tmp;int cnt = 0;scanf ("%d %d", &n, &amount);for (int i = 0; i < n; i++) {scanf ("%d", &tmp);if(tmp <= amount) coins[cnt++] = tmp;}n = cnt;qsort(coins, n, sizeof(int), compare_ints); if(find(0, amount)){ printf("%d",coins[path[0]]); for (int i = 1; i < path.size(); i++) { printf(" %d", coins[path[i]]); } }else printf("No Solution\n");}
0 0
- PAT.Advanced.P1068
- PAT Advanced 1065
- PAT Advanced 1001
- PAT Advanced 1043
- PAT Advanced 1042
- PAT Advanced 1067
- PAT Advanced 1066
- PAT Advanced 1005
- pat advanced 1044
- pat advanced 1042
- pat advanced 1043
- pat advanced 1032
- pat:1002(Advanced)
- pat advanced 1050
- pat advanced 1051
- pat advanced 1046
- pat advanced 1054
- pat advanced 1003
- java对redis的基本操作
- hdu 1754 I hate it(线段树单点更新)
- Mac下svn提交.a文件
- GLUT 回调函数小结
- cordova(phonegap)搭建和使用sqlite数据库
- PAT.Advanced.P1068
- window.showModalDialog以及window.open用法简介
- Android r文件丢失的解决办法
- 科研项目之经验之谈
- pl/sql_1_结构
- MINA框架的搭建主要的类与发法
- Python Tkinter Grid简明彻底理解
- Windows 7下安装MongoDB
- leetcode第136题-Single Number