csu 1640 机智的刷题方式(完全背包)
2015-07-11 20:34
435 查看
#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include <vector> #include <queue> #include <set> #include <map> #include <string> #include <math.h> #include <stdlib.h> #include <time.h> using namespace std; const int N=10000+10; const int inf=0x7FFFFFFF; int dp ; int main() { int a,b,c,_,i,j,h,x,ans1,ans2; scanf("%d",&_); while(_--) { scanf("%d%d%d",&a,&b,&c); scanf("%d%d",&h,&x); for(i=0; i<N; i++) dp[i]=inf; dp[0]=0; for(i=1; i<=h+8; i++) { if(dp[i-1]+a<dp[i]) dp[i]=dp[i-1]+a; } for(i=2; i<=h+8; i++) { if(dp[i-2]+b<dp[i]) dp[i]=dp[i-2]+b; } for(i=5; i<=h+8; i++) { if(dp[i-5]+c<dp[i]) dp[i]=dp[i-5]+c; } ans1=inf; for(i=h; i<=h+8; i++) { ans1=min(ans1,dp[i]); } memset(dp,0,sizeof(dp)); for(i=a; i<=x; i++) { if(dp[i]<dp[i-a]+1) dp[i]=dp[i-a]+1; } for(i=b; i<=x; i++) { if(dp[i]<dp[i-b]+2) dp[i]=dp[i-b]+2; } for(i=c; i<=x; i++) { if(dp[i]<dp[i-c]+5) dp[i]=dp[i-c]+5; } printf("%d\n%d\n",ans1,dp[x]); } return 0; }
相关文章推荐
- 如何学习硬件设计——实践篇
- Sqlplus登录时出现无法定位程序输入点longjmp于动态链接库的错误提示
- Java String类练习题
- 又隔了两天没有来这里了。考试前的努力。
- 欢迎使用CSDN-markdown编辑器
- Android Binder机制实现进程间数据交换(不使用aidl实现)
- NetworkRequest网络请求数据类
- Intersection of Two Linked Lists
- 1004. 成绩排名 (20)
- 第7章 攻防评分法(HITS的孩子) 实例和程序
- JSON简介以及用法代码汇总
- Poj3414广泛搜索
- JS兼容的方式来获取浏览器的宽度
- 取样问题 总数n事先不知道,等概率取样 (编程珠玑chapter12 课后题10)
- Unique Binary Search Trees II
- SharedPreferences(偏好设置)的使用
- HDU-4786-Fibonacci Tree
- 【面试题】用栈实现队列
- 面试常考算法题 局部最小 求二叉树结点 求两个数组中所有数的上中位数 两个数组的所有数中第K小的数
- myeclipse、eclipse中项目复制后(可能无法访问)注意事项 .