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

解决方案 »

  1.   

    笨方法,供参考:
    输入条件
    1 总价a=1000
    2 种类m为1...m
    3 每类价格m1 m2 m3...mm
    要求算m种商品组合后总价为1000计算:
    1 数组a1[m]存种类 大于0;
      a2[m]存每类价格,也就是a2[0]=m1,a2[1]=m2,a2[2]=m3,依此类推,价格不能为0;
      a3[m]存每类最多的数量,也就是1000/a2[x],不要小数,比如a2[0]=10,则a3[0]=100,表示最多买100个这个商品;
      list1集合存每种结果的数量,比如m=3 m1=10 m2=15 m3=20时list1第1行为 100 0  0 ,list1.count就是方案数.

    2.1 第1次算单独买1种商品时刚好总价=1000的数量,循环m次,有符合结果存到list1
        如上面的例子所示m=3时循环3次,得出2个结果
        100   0   0   //10*100个
          0   0  50   //20*50个
    2.2 第2次算每买2种商品时总价=1000的情况,也就是只有2个种类有数量,其他种类买的数量是0。
        上例中就是 1-2  1-3  2-3 这3种组合,每种组合用2个嵌套循环算出结果,如
         for (i0=1;i0<=a3[0];i0++)
           for (i1=1;i1<=a3[1];i1++)
             if ((a2[0]*i0 + a2[1]*i1) == 1000) //符合结果
    2.3 第3次算每买3种商品时总价=1000的情况,共有(m中取n组合)种组合,上例中就是1-2-3 情况,
        每种组合用3个嵌套循环算出结果
         for (i0=1;i0<=a3[0];i0++)
           for (i1=1;i1<=a3[1];i1++)
             for (i2=1;i2<=a3[2];i2++)
               if ((a2[0]*i0 + a2[1]*i1 + a2[2]*i2) == 1000) //符合结果
    ...
    2.4 依此,一直计算到第m次同时买m种商品时总价=1000的情况,得出结果,结束.
        2.1到2.4用可用递归或条件循环.