1. 程式人生 > >購物券消費方案 公司發了某商店的購物券1000元,限定只能購買店中的m種商品。 每種商品的價格分別為m1,m2,…,要求程式列出所有的正好能消費完該購物券的不同購物方法。

購物券消費方案 公司發了某商店的購物券1000元,限定只能購買店中的m種商品。 每種商品的價格分別為m1,m2,…,要求程式列出所有的正好能消費完該購物券的不同購物方法。

/*	購物券消費方案
公司發了某商店的購物券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