Fork me on GitHub

C算法编程题(七)购物

前言

  上一篇《C算法编程题(六)串的处理

  有些朋友看过我写的这个算法编程题系列,都说你写的不是什么算法,也不是什么C++,大家也给我提出用一些C++特性去实现问题更方便些,在这里谢谢大家提的一些建议和意见,我当时写这个系列的目的不是探讨算法和C++的特性,可能是我标题写的不好吧,让大家误解了,再这里给大家说声抱歉。

  大家都学过数学,做过奥数题,其实大家看看我写的前几篇文章就会发现,做这类编程题就像做奥数题一样,锻炼的是我们的逻辑思维能力,我当时写的目的也是这样。如果说用一些语言的特性去实现,那我就不用C++了,直接用C#更好的实现,用到C++只是一些简单的不能再简单的语法而已。

  做编程题和做奥数题一样,只不过一个用数学的方式、一个用编程的方式;一个写在纸上、一个运行在电脑上;只要是思路通了,不管用什么方式都可以解决问题,只不过工具不同而已。

  国外一些早期的牛叉编程高手都是数学家出身,所以说学好编程先学好数学。

程序描述

  公司发了某商店的购物券1000元,限定只能购买店中的m种商品。每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。
    程序输入:
    第一行是一个整数m,代表可购买的商品的种类数。
    接下来是m个整数,每个1行,分别代表这m种商品的单价。
    程序输出:
        第一行是一个整数,表示共有多少种方案
        第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。
    例如:
        输入:
        2
        200
        300
    则应输出:
        2
        2  2
        5  0
        输入:
        2    
        500
        800
        则应输出:
        1
        2  0

程序实现

  刚看到这个题,有点像找配对的感觉,其实做这种题就是思维能力的问题了,有的人一个小时就可以做出来,有的人哪怕做一天也做不出来。

  这里我说一种最常用的思路,我们输入商品个数是2,单价分别为200和300,那我们先这样想,1000块最大可以200的商品是5个,最大可以买300的商品2个,只是考虑在1000块以内,买一种剩余的钱我们不考虑,所以我们可以分别找在买5个以内200的商品,看可以买300块商品有几个,就是买5个、4个、3个、2个、1个、0个200的商品,剩余的钱可以买多少个300的商品。如果加起来正好是1000块,那就是一种购买的情况。

  思路就是这样,代码用到了一点递归的思想,我就不多说,大家自己理解下。

  完整代码:

 1 #include"stdio.h"
 2 int a[1000];//存放商品价格
 3 int counter=0;
 4 int c[1000];
 5 int num;//商品数目
 6 void f(int b[],int i)
 7 {
 8     int j,sum=0;
 9     if(i>=num)
10     {
11         return ;
12     }
13     else
14     {
15         c[i]=1000/a[i];
16         for(b[i]=0;b[i]<=c[i];b[i]++)
17         {
18             sum=0;
19             if(i==num-1)
20             {
21                 for(j=0;j<num;j++)
22                 {
23                     sum+=b[j]*a[j];
24                 }
25                 if(sum==1000)
26                 {
27                     for(j=0;j<num;j++)
28                     {
29                         printf("%d   ",b[j]);
30                     }
31                     printf("\n");
32                     counter++;
33                 }
34             }
35             else
36             {
37                 f(b,i+1);
38             }
39         }
40         return ;
41     }
42 }
43 void main()
44 {
45     int b[1000]={0};
46     int c[1000];
47 
48     int i,j,m=0,sum;
49     printf("商品数目:\n");
50     scanf("%d",&num);
51     printf("商品价格:\n");
52     while(m<num)
53     {
54         scanf("%d",&a[m]);
55         m++;
56     }  
57     i=0;
58     c[i]=1000/a[i];
59     for(b[i]=0;b[i]<=c[i];b[i]++)
60     {
61         f(b,i+1);
62     }
63     printf("%d\n",counter);
64     getchar();
65 }

  运行结果:

 

posted @ 2013-11-13 16:16  田园里的蟋蟀  阅读(2177)  评论(3编辑  收藏  举报