本帖最后由 jackz007 于 2020-11-6 13:56 编辑
取得面额数量,根据面额数量取得各个面额值保存到数组,按从大到小的顺序,对面额值数组重新排序,输入目标金额,循环,按面额由大到小的顺序拼凑目标金额,直到最终完成。
下面是我按照上述思想编写的代码及编译、运行实况,谨供楼主参考#include <stdio.h>
void sort(float g[] , const int m)
{
float t ;
int i , j ;
for(i = 1 ; i < m ; i ++) {
for(j = i ; j && g[j] > g[j - 1] ; j --) {
t = g[j] ;
g[j] = g[j - 1] ;
g[j - 1] = t ;
}
}
}
main(void)
{
float g[100] , r , t ;
int h[100] , f , k , m , n ;
printf("请输入面额数量:") ;
scanf("%d" , & m) ;
printf("请输入面额数值:") ;
for(k = 0 ; k < m ; k ++) scanf("%f" , & g[k]) ;
sort(g , m) ;
printf("请输入目标金额:") ;
scanf("%f" , & t) ;
for(r = 0.0 , f = 0 , n = 0 , k = 0 ; k < m && r < t ; k ++) {
h[k] = 0 ;
while(r + g[k] <= t) {
r += g[k] ;
h[k] ++ ;
}
if(r == t) {
n = k + 1 ;
f ++ ;
break ;
}
}
if(f) {
printf("\n目标 %.2f 元的最佳组合方案为:\n" , t) ;
for(k = 0 ; k < n ; k ++) if(h[k]) printf("%6.2f x %d\n" , g[k] , h[k]) ;
} else printf("抱歉:问题无解\n") ;
printf("\n") ;
}
编译、运行效果:D:\0002.Exercise\C>g++ -o x x.c
D:\0002.Exercise\C>x
请输入面额数量:6
请输入面额数值:1 5 10 20 50 100
请输入目标金额:999
目标 999.00 元的最佳组合方案为:
100.00 x 9
50.00 x 1
20.00 x 2
5.00 x 1
1.00 x 4
D:\0002.Exercise\C>
|