当前位置:编程学习 > C#/ASP.NET >>

求助,自己做了好久也没做出来。

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


用c#这么写呀 --------------------编程问答-------------------- 关注 --------------------编程问答-------------------- 笨方法,供参考:
输入条件
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用可用递归或条件循环.
--------------------编程问答-------------------- 这个用穷举法是肯定可以做出来的,但是速度会随着m的增加而变得很慢,因此不是做不出来,而是优化方案不好找,如果你只是为了交差,就先用穷举法,对每种可能性验证结果即可,以后再找是否有优化方案。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,