|
发表于 2020-11-6 13:42:15
|
显示全部楼层
本帖最后由 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>
复制代码 |
|