#include <stdio.h> |
#include <stdlib.h> |
#define INF 100000000 |
#define MAXNUM 10000 |
#define MONEYKIND 100 |
int n,S; |
int V[MONEYKIND]; |
int min[MAXNUM],max[MAXNUM]; |
void dp( int *, int *); |
//递推方法函数声明 |
void print_ans( int *, int ); |
//输出函数声明 |
int main() |
{ |
int i; |
printf ( "输入硬币的种数n(1-100):\n" ); |
scanf ( "%d" ,&n); |
printf ( "输入要组合的钱数S(0-10000):\n" ); |
scanf ( "%d" ,&S); |
printf ( "输入硬币种类:\n" ); |
for (i=1; i<=n; i++) |
{ |
scanf ( "%d" ,&V[i]); |
} |
dp(min,max); |
printf ( "最小组合方案:\n" ); |
print_ans(min,S); |
printf ( "\n" ); |
printf ( "最大组合方案:\n" ); |
print_ans(max,S); |
return 0; |
} |
void dp( int *min, int *max) |
//递推过程实现 |
{ |
int i,j; |
min[0] = max[0] = 0; |
for (i=1; i<=S; i++) //初始化数组 |
{ |
min[i]=INF; |
max[i]=-INF; |
} |
for (i=1; i<=S; i++) |
for (j=1; j<=n; j++) |
if (i>=V[j]) |
{ |
if (min[i-V[j]]+1<min[i]){ |
min[i]=min[i-V[j]]+1; //最小组合过程 |
//printf("%d\n",min[i]); |
} |
if (max[i-V[j]]+1>max[i]) |
max[i]=max[i-V[j]]+1; //最大组合过程 |
} |
} |
void print_ans( int *d, int S) |
//输出函数实现 |
{ |
int i; |
for (i=1; i<=n; i++) |
if (S>=V[i]&&d[S]==d[S-V[i]]+1) |
{ |
printf ( "%d-" ,V[i]); |
print_ans(d,S-V[i]); |
break ; |
} |
} |
by: 发表于:2017-08-09 10:52:22 顶(0) | 踩(0) 回复
??
回复评论