[算法]硬币问题(动态规划)
2015-07-20 16:46
330 查看
/* Name:硬币问题(动态规划) Actor:HT Time:2015年7月20日 Error Reporte: 1.不能得到答案时的限定。该题目中初始化,以及每次循环初形态要注意判断 } */ #include "stdio.h" #include "conio.h" #include "string.h" #define N 5 #define M 100000 int size ; int dmin[M]; int dmax[M]; void print(int d[] , int s) { for(int i=0;i<N;i++) { if( s >= size[i] && d[s]==d[s-size[i]]+1) { printf("%d ",size[i]); print(d,s-size[i]); break; } } } int main() { int i,j,sum; scanf("%d",&sum); for(i=0;i<N;i++) scanf("%d",&size[i]); for(i=0;i<=sum;i++) //初始化 { dmin[i] = sum+1; dmax[i] = -1; } dmin[0] = 0; dmax[0] = 0; for(i=1;i<=sum;i++) for(j=0;j<N;j++) { if(i>=size[j]&&(dmin[i] > dmin[i-size[j]] + 1)) dmin[i] = dmin[i - size[j]] + 1; if(i>=size[j]&&((dmax[i] < dmax[i-size[j]] + 1)&&(dmax[i-size[j]]!=-1))) //定要注意,万一不能得出结果,不要动数值,所以判定!=-1 dmax[i] = dmax[i - size[j]] + 1; } printf("Min = %d, Max = %d\n",dmin[sum],dmax[sum]); /*for(i=0;i<=sum;i++) printf("%d\n",dmin[i]);*/ print(dmin,sum); printf("\n"); print(dmax,sum); } /* d[剩余钱数] = 最少张数 d[a] = d[a-s] + 1; d[a] = max/min(d[a],d[a-ijk] + 1,if a>ijk ) 2 1/2 1 1 0 0 */
相关文章推荐
- LeetCode11:Container With Most Water
- java 缓存读写
- 【BootStrap】 基础
- position: absolute 的元素自动对齐父元素 border 外边缘
- openssl自签发证书以及ssl原理简介(二)
- PHP CURL模拟JQuery的Ajax请求头(添加可显示在_SERVER中的参数)
- 编程中的好习惯
- 【Linux-shell】shell脚本基础语法练习
- 没参加的2015百度之星——找连续数
- PowerDesigner从DB2生成物理模型
- C++求解数组中出现超1/4的三个数字。
- app是怎么炼成的
- epoll之ET与LT模式
- Android应用开发SharedPreferences存储数据的使用方法
- 如何让height:100%起作用
- android sdk无法下载及解决办法
- matlab处理double jpeg问题常用函数不定期汇总
- 关于Bugzilla过滤(不显示CLOSED的bug)
- 密钥登陆Linux服务器
- HTML5拖放本地资源