算法導論:找零錢問題

題目java

假設有1元、2元、5元、10元、20元、50元、100元、200元面額的硬幣或者紙幣。如今須要N元錢,有多少種零錢組合方式?數組

解題spa

DFS比較簡單.net

    public void DFS(int m,int[]A,int start,ArrayList<String>result,String str){
        if(m == 0){    
            result.add(str);
            return;
        }
        if(A[start]> m){
            return;
        }
        for(int i = start;i<A.length;i++){
            DFS(m - A[i],A,i,result,str+ " "+A[i]);
        }
    }

如上:code

1.判斷是不是 0blog

是,保存get

2.是否非法class

3.遍歷組合可能import

projecteuler31驗證結果正確List

固然這樣會有許多重合的子問題,更改成動態規劃,定義數組保存中

dp[j] = dp[j] + dp[j -A[i]]; // 面值j的零錢能夠寫出:j = A[i] + (j - A[i]) 求出全部組合方式就是答案

    public void DP(int money,int[]A){
        int dp[] = new int[money+1]; // dp[j] 表示 j元錢的零錢的組合方式 
        dp[0] = 1;
        for(int i = 0;i<A.length;i++){
            for(int j = A[i];j<= money;j++){
                dp[j] = dp[j] + dp[j -A[i]]; // 面值j的零錢能夠寫出:j = A[i] + (j - A[i]) 求出全部組合方式就是答案
            }
        }
        System.out.println(dp[money]);
    }

 

然而貪心的轉不過去,網上只看到使得找零的硬幣數量最少的硬幣數量,而是找零方式的數量

    public void Greedy(int money,int[] A){
        int num = 0;
        for(int i =A.length-1;i>=0;i--){
            num=num+money/A[i]; //先把面值較大的找了
            money = money%A[i];
        }
        System.out.println(num);
    }

 

全部程序

package greedy;
import java.util.*;
public class changeMoney {
    public void DP(int money,int[]A){
        int dp[] = new int[money+1]; // dp[j] 表示 j元錢的零錢的組合方式 
        dp[0] = 1;// 初始是 1 才能dp[j] = dp[j] + ** 才能增長
        for(int i = 0;i<A.length;i++){
            for(int j = A[i];j<= money;j++){
                dp[j] = dp[j] + dp[j -A[i]]; // 面值j的零錢能夠寫出:j = A[i] + (j - A[i]) 求出全部組合方式就是答案
            }
        }
        System.out.println(dp[money]);
    }
    public void Greedy(int money,int[] A){
        int num = 0;
        for(int i =A.length-1;i>=0;i--){
            num=num+money/A[i]; //先把面值較大的找了
            money = money%A[i];
        }
        System.out.println(num);
    }
    public void DFS(int m,int[]A,int start,ArrayList<String>result,String str){
        if(m == 0){    
            result.add(str);
            return;
        }
        if(A[start]> m){
            return;
        }
        for(int i = start;i<A.length;i++){
            DFS(m - A[i],A,i,result,str+ " "+A[i]);
        }
    }
    public static void main(String[] args){
        changeMoney cM = new changeMoney();
        int[] A={1,2,5,10,20,50,100,200};
        ArrayList<String> result = new ArrayList<String>();
        int money = 200;//73682
        cM.DFS(money,A,0,result,"");
        System.out.println(result.size());
        cM.DP(money, A);//73682
        cM.Greedy(money, A);//1
    }
}
相關文章
相關標籤/搜索