您的位置:首页 > 其它

[算法]硬币问题(动态规划)

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
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: