USACO milk4 枚举答案再检验
2016-02-03 22:39
441 查看
刚开始写了一个暴力的dfs超时了, 最后看了下题解说是先枚举答案再判断,然后就写了双dfs,全部秒杀,代码如下:
/* ID: m1500293 LANG: C++ PROG: milk4 */ #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int Q, P; int t[110]; bool dfs1(int dept, int a[], int num, int rQ) { if(rQ==0) return true; if(dept==num) return false; bool res = false; for(int i=1; i<=Q/a[dept]; i++) { if(rQ-a[dept]*i >= 0) res = res || dfs1(dept+1, a, num, rQ-a[dept]*i); } return res; } bool flog; void dfs(int dept, int a[], int num, int nn) { if(flog) return ; if(num > nn) return; if(num == nn) { if(dfs1(0, a, num, Q)) { printf("%d ", num); for(int i=0; i<num; i++) printf("%d%c", a[i], i==num-1?'\n':' '); flog = true; } return ; } if(dept == P) return; a[num] = t[dept]; dfs(dept+1, a, num+1, nn); dfs(dept+1, a, num, nn); } bool cmp(const int &a, const int &b) { return a<b; } int main() { freopen("milk4.in", "r", stdin); freopen("milk4.out", "w", stdout); scanf("%d%d", &Q, &P); for(int i=0; i<P; i++) scanf("%d", &t[i]); sort(t, t+P, cmp); int a[110]; flog = false; for(int i=1; i<=P&&!flog; i++) { dfs(0, a, 0, i); } return 0; }
相关文章推荐
- Codeforces Round #341 (Div. 2)(B)数学
- Python 14.3 UDP编程
- poj1088 dp 记忆化搜索 (入门好题)
- Nios学习笔记1——流水灯实验
- vim与复制,删除,粘贴,块操作以及快速替换功能
- Git Shell 基本命令(官网脱水版)
- Table ‘performance_schema.session_variables’ doesn’t exist
- BitmapFactory.Options详解
- Codeforces 621 E Wet Shark and Blocks
- Python与Qt UI的图形界面编程(一)
- break,continue,return的区别
- Linux部分命令解释(命令缩写代表什么意思)
- 记录安卓学习过程(1)
- 【斜率优化】[CEOI2004]锯木厂选址——从这里开始斜率优化的大门
- php中函数的定义,调用,及获取参数的方法。和位运算等。
- HDU.1003【max-sum】---16.2.3
- react(2)--Thinking in React
- ORB-SLAM2:基于可识别特征的自主导航与地图构建
- log4j【5】( log4j日志异步化大幅提升系统性能 )
- hdu 4489 The King’s Ups and Downs (组合数学 + dp )