購物券消費方案 公司發了某商店的購物券1000元,限定只能購買店中的m種商品。 每種商品的價格分別為m1,m2,…,要求程式列出所有的正好能消費完該購物券的不同購物方法。
阿新 • • 發佈:2019-02-08
執行結果:/* 購物券消費方案 公司發了某商店的購物券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