
#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) 回复
??
回复评论