| 
 | 
 
 
发表于 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>
 
  复制代码 |   
 
 
 
 |