购物券消费方案 公司发了某商店的购物券1000元,限定只能购买店中的m种商品。 每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。
2013-04-18 18:50
726 查看
/* 购物券消费方案 公司发了某商店的购物券1000元,限定只能购买店中的m种商品。 每种商品的价格分别为m1,m2,…,要求程序列出所有的正好能消费完该购物券的不同购物方法。 程序输入: 第一行是一个整数m,代表可购买的商品的种类数。 接下来是m个整数,每个1行,分别代表这m种商品的单价(0<m<1000)。 程序输出: 第一行是一个整数,表示共有多少种方案 第二行开始,每种方案占1行,表示对每种商品购买的数量,中间用空格分隔。 例如: 输入: 2 200 300 则应输出: 2 2 2 5 0 输入: 2 500 800 则应输出: 1 2 0 输入: 1 999 则应输出: 0 多个方案间的顺序不重要。 */ import java.util.Arrays; import java.util.Scanner; import java.util.List; import java.util.ArrayList; public class Demo09 { static int[] temp; // 保存每次的结果,用来比较与下次的结果是否相同 static List<int[]> lis = new ArrayList<int[]>(); public static void print(){ for(int[] x:lis){ for(int y:x){ System.out.print(y+" "); } System.out.println(); } } // 上次记录的结果,和当前这次记录比较是否相同 public static boolean compare(int[] t){ if(temp==null) return false; for(int i=0;i<t.length;i++){ if(temp[i]!=t[i]) return false; } return true; } // 检测符合条件的组合 public static boolean check(int[] n,int[] t){ int sum = 0; for(int i=0;i<n.length;i++){ sum += t[i]*n[i]; } if(sum==1000){ return true; } return false; } public static void f(int[] n,int[] b,int[] t,int count){ if(count>=b.length) return; for(int i=0;i<=b[count];i++){ t[count] = i; // 保存当前i的值 f(n,b,t,count+1); // 迭代 if(!compare(t)){ // 去重 if(check(n,t)){ // 检测符合条件的组合 将数组添加到lis列表 lis.add(Arrays.copyOf(t, t.length)); } }// 用temp记录结果,下次比较是否相同用(去重) temp = Arrays.copyOf(t, t.length); } } public static void main(String[] args){ Scanner scan = new Scanner(System.in); System.out.println("输入商品的种类数"); int num = scan.nextInt(); int[] n = new int[num]; // 保存商品价格 int[] b = new int[num]; // 保存每个商品最多有几个 for(int i=0;i<num;i++){ n[i] = scan.nextInt(); // 输入每个商品价格 b[i] = 1000/n[i]; // 记录每商品的个数 } f(n,b,new int[num],0); if(lis.size()==0){ // 没有元素 System.out.println(0); }else{ System.out.println(lis.size()); // 元素个数 print(); // 输出结果 } } }运行结果:
输入商品的种类数 2 200 300 2 2 2 5 0
相关文章推荐
- 输入商品种数和价格,列出所有的正好能消费完1000元购物券的不同购物方法
- 实现功能要求统计图书的总价,编写方法查询出在50元以上的所有图书,使用排序接口图书按照价格排序(升序排序)
- 解决“只能通过Chrome网上应用商店安装该程序”的方法
- 让程序分别在DEBUG模式和RELEASE模式选择不同代码路径的方法 _DEBUG
- 解决“只能通过Chrome网上应用商店安装该程序”的方法
- 你就是一个画家!你现在想绘制一幅画,但是你现在没有足够颜色的颜料。为了让问题简单,我们用正整数表示不同颜色的颜料。你知道这幅画需要的n种颜色的颜料,你现在可以去商店购买一些颜料,但是商店不能保证能供应所有颜色的颜料,所以你需要自己混合一些颜料。混合两种不一样的颜色A和颜色B颜料可以产生(A XOR B)这种颜色的颜料(新产生的颜料也可以用作继续混合产生新的颜色,XOR表示异或操作)。本着勤俭节约的
- 解决“只能通过Chrome网上应用商店安装该程序”的方法
- 解决“只能通过Chrome网上应用商店安装该程序”的方法
- 解决“只能通过Chrome网上应用商店安装该程序”的方法
- 用1、2、3、3、4、5这六个数字,用java写一个程序,打印出所有不同的排列 要求:"4"不能在第三位,"3"与"5"不能相连。
- 判断101-200之间有多少个素数,并输出所有素数。 程序分析:判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除, 则表明此数不是素数,反之是素数。
- 解决“只能通过Chrome网上应用商店安装该程序”的方法
- 解决“只能通过Chrome网上应用商店安装该程序”的方法
- 《OPCDA服务器与客户程序开发指南》价格及购买方法
- 彩球分配问题:共有12个彩球,4个红的,4个白的,4个黄的,从中挑出8个球放入3个不同的口袋(口袋编号分别为a、b、c)编写程序打印输出所有可能的放法。
- google浏览器提示:“只能通过Chrome网上应用商店安装该程序”的方法
- 给定n个数{1,2,…n},从中选取任意两两不同的k个数,请编写程序输出所有的可能的选择,要求不重不漏。
- 解决“只能通过Chrome网上应用商店安装该程序”的方法
- 通过改变计算机策略来解决“只能通过Chrome网上应用商店安装该程序”的方法及模版文件下载