1. 程式人生 > >動態規劃解決換錢的方法數

動態規劃解決換錢的方法數

  1. 簡述題目:用1元,2元,5元,換成20元。一共有多少種換法。每一種紙幣數量不限。
  2. 暴力分析。直接利用每種紙幣的限制條件窮舉。方法簡單直接。

public class StaticTest {
     public static void main(String[] args) {
         int num=0;
        for(int i=0;i<=20;i++)
        {
            for(int j=0;j<=10;j++)
            {
                for(int k=0;k<=4;k++)
                {
                    int
sum=0; sum=i+j*2+k*5; if (sum==20) { num++; System.out.println("1元"+i+" "+"2元"+j+" "+"5元"+k); } } } } System.out.println(num); } }

3很明顯這個問題有最優子結構性質,和重複子問題。動態規劃很合適解決。.動態規劃解決思路:假設我們有i種貨幣,要換j錢。則有很多情況,第1種情況i種紙幣不要,則方法數=dp[i-1][j],第2種情況i種貨幣取一個,則方法是=dp[i-1][j-1*第i種紙幣的價值],……..,直到第i種紙幣數量*價值小於j.
4.直觀展示。dp[i][j]表示用i種紙幣,能換到j錢的方法數。其實如果能完成這個表格。就個問題就解決了。下面我們就用程式碼的方式來解決。
這裡寫圖片描述


5.程式碼展示


public class ChangeMoney {

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        int[] money={0,1,2,5};
        int all=20;
        int[][] dp=new int[4][21];
        //生成動態規劃表
        createTable(money,all,dp);
        System.out.println(dp[3][20]);
    }

    private
static void createTable(int[] money, int all,int[][] dp) { // TODO Auto-generated method stub int temp; //這個地方其實有點寫死。這裡第一種紙幣是1. for(int j=1;j<=20;j++) { dp[0][j]=0; } for(int j=0;j<=3;j++) { dp[j][0]=1; } for(int j=0;j<=20;j++) { dp[1][j]=1; } //初始化結束 for(int i=1;i<=3;i++) { for(int j=1;j<=20;j++) { int sum=0; temp=j/money[i]; //取i種紙幣的次數 for(int k=0;k<=temp;k++) { sum+=dp[i-1][j-k*money[i]]; } dp[i][j]=sum; } } } }

6.結果比較。暴力和動態規劃都是29種。
7.總結其實,我這個問題這個地方紙幣是1,2,5。如果換成其它的。其它也很簡單,根據其它的,把那個初始的地方,重新計算一下。就行了。思路明白才重要。其它這個問題還可以用回溯法解決。其它也很簡單。就不介紹了。

相關推薦

動態規劃解決換錢方法

簡述題目:用1元,2元,5元,換成20元。一共有多少種換法。每一種紙幣數量不限。 暴力分析。直接利用每種紙幣的限制條件窮舉。方法簡單直接。 public class StaticTest { public static void main(

動態規劃換錢的最少貨幣

1、題目描述:給定陣列arr,,大小為N,arr中所有的值都為正數且不重複。每個值代表一種面值的貨幣,每種面值的貨幣可以使用任意張,再給定一個整數aim代表要找的錢數,求組成aim的最少貨幣數。 舉例:arr=[5,2,3],aim=20,返回4;arr=[5,2,3],a

動態規劃解決塔問題

一、題目 如圖所示,將一些數字排成數塔的形狀,其中第一層有一個數字,第二層有兩個數字.……第n層有n個數子。現在要從第一層走到第n層,每次只能走向下一層的接連兩個數字的其中一個,問:最後將路徑上所有數

53. Maximum Subarray(動態規劃 求最大子組)

lse pan int scrip mat rip pos 動態規劃 script Find the contiguous subarray within an array (containing at least one number) which has

android 方法超過65k,解決dex方法超過65536

65k android應用程序方法超限 解決android dex文件方法數過 最近有朋友在問我,為什麽我就加了一個類/一個庫突然跑不起來了。 排查方式: 1、確認你的代碼/引用沒有問題 2、檢查是否是65k問題 今天主要是解決 排查方式2的步驟,這個原因主要是因為你的apk包方法數過大。 現在

動態規劃_二項式系

wid XML absolut 算法 選擇 add font relative main 動態規劃之二項式系數 @(算法學習) (nk)=n!(n?k)!k! 計算二項式系數的問題在於,系數本身在int表示範圍內,但是計算用到的分子是階乘,這個是很大的數,會導致溢出的問題。

動態規劃_連續子組的最大和

但是 == 向量 常常 ret pub num 負數 測試 題目描述 HZ偶爾會拿些專業問題來忽悠那些非計算機專業的同學。今天測試組開完會後,他又發話了:在古老的一維模式識別中,常常需要計算連續子向量的最大和,當向量全為正數的時候,問題很好解決。但是,如果向量中包含負數,是

最長公共子串LCS問題(動態規劃及備忘錄方法

動態規劃與備忘錄的LCS實現 動態規劃從下到上積累能量,中間值全部記錄以方便後期計算時呼叫,但有些時候很多記錄的值用不到,這個時候備忘錄方法則更好,可以減少記錄的值,其特點是自上到下,記錄少部分值。以LCS最長公共子串問題威力,分別給出兩種實現。 動態規劃法: pa

動態規劃解決揹包問題

1 揹包問題:給定n個重量為w1,w2...wn,價值為v1,v2...vn的物品和一個承重量為W的揹包,求這些物品中最有價值的一個子集,並且要能夠裝入揹包當中。 2 動態規劃:動態規劃與分治法都要求原問題的最優子結構,都是將問題分而治之,,不同的是動態規劃適用於交疊子問題的情況,分治法則適用於子問題相互獨

BZOJ5125 小Q的書架(決策單調性+動態規劃+分治+樹狀組)

zoj esp 基礎 out 決策單調 註意 spa void get   設f[i][j]為前i個劃成j段的最小代價,枚舉上個劃分點轉移。容易想到這個dp有決策單調性,感性證明一下比較顯然。如果用單調棧維護決策就不太能快速的求出逆序對個數了,改為使用分治,移動端點時樹狀數

【演算法】動態規劃解決0-1揹包的兩個疑惑

1. 揹包問題 描述: 給定 n 種物品,每種物品有對應的重量weight和價值value,一個容量為 maxWeight 的揹包,問:應該如何選擇裝入揹包的物品,使得裝入揹包中的物品的總價值最大? 過程:   a) 把揹包問題抽象化(X1,X2,…,Xn,其中 Xi

動態規劃解決最長公共子序列問題

一、相關概念 1 子序列:如果序列Z={z1,z2,z3…zk},可以由序列X={x1,x2,x3…xn}刪除(或不刪除)一些元素得到,則Z為X的一個子序列。Z維持了X序列的相對順序。 2 動態規劃:使用分治法將問題劃分成一個個子問題,當分解的問題共享子問題時,

動態規劃解決投資決策問題

#include<iostream> #include<cstring> using namespace std; int T[10][10];//i表示投資的專案,j表示投資的錢,T[i][j]表示利潤 int get_most_money(int

動態規劃(3)格子取問題

問題描述: 有n*n個格子,每個格子裡有正數或者0,從最左上角往右下角走。一共走2次,(即從左上角走到右下角走兩次),把所有經過的格子裡的數加起來,求總和的最大值。如果兩次經過同一個格子,則最

斐波那契數列和階乘的尾函式優化,動態規劃解決最小硬幣找零和揹包問題

// 遞迴是一種解決問題的方法,它解決問題的各個小部分,直到解決最初的大問題。遞迴通常涉及函式呼叫自身 // 斐波那契數列尾呼叫優化 function fibonacci(n, acc1 = 1, acc2 = 1) { if (n === 1 || n === 2) { ret

動態規劃解決01揹包問題

一、問題描述:有n 個物品,它們有各自的重量和價值,現有給定容量的揹包,如何讓揹包裡裝入的物品具有最大的價值總和? 二、總體思路:根據動態規劃解題步驟(問題抽象化、建立模型、尋找約束條件、判斷是否滿足最優性原理、找大問題與小問題的遞推關係式、填表、尋找解組成)找出01揹包問題的最優解以及解組成,然後編寫程式碼

動態規劃解決N個數之和為K

問題:給定一個整數K和n個不同大小的商品,第i個物品的大小整數位ki ,尋找一個物品的子集,它們的和正好為為K ,或者確定不存在這樣的子集 用動態規劃解決問題的時候,求出問題的一個解,而不是所有的解。如果求出所有的解,我目前想到的用回溯法解決,不過要指數之間的複雜度 P(N

從暴力求解到動態規劃—— 7 種方法求解連續子陣列的最大和問題(python實現)

問題描述 已知一個數組 a[n],裡面存放著浮點數,可能是正數、負數或0。求它的所有連續子陣列中的最大和。 連續子陣列:指的是陣列的一個連續切片,即可以表示為 a[i:j],0≤i≤j<n。 連續子陣列的和:比如連續子陣列為 a[i:j] ,則和為

0-1揹包問題,用滾動陣列,動態規劃解決

接觸了很多的0-1揹包的問題,這個問題是動態規劃的經典題,總結一下,加深自己的印象,也 為大家做個參考,對blog有問題可以直接評論,我會盡快的回答! 題目:有N件物品和一個容量為V的揹包,第i件物品的體積w[i],價值是c[i],求解將那些物品裝入揹包 可使這些物品的費