砝碼稱重問題求解 動態規劃與母函式方法

2021-09-06 08:35:31 字數 1592 閱讀 1384

砝碼稱重問題:設有1g、2g

、3g、5g

、10g

、20g

的砝碼各若干枚(其質量

<=1000g

),求出用他們能稱出的質量的種類數(不包括質量為0的情況)。

一、動態規劃方法求解

設dp[1000]陣列為標記陣列。當dp[i]=0時,表示質量為i的情況,目前沒有稱出;當dp[i]=1時,表示質量為i的情況已經稱出。

本題目中有多個砝碼,我們順序處理每乙個砝碼。

當處理第j個砝碼,質量為wj時,有下列推導公式:

完整程式**如下:

#include#include

int sum; ///

表示輸入的砝碼的總質量

int ma[6]; ///

六種砝碼的個數

int weight[6]=; ///

六種砝碼的重量

char dp[1001]; ///

標記位void input(); ///

輸入每個砝碼的數量,並求出所有砝碼的總質量sum

void

exedp();

void output(); ///

判斷標記為1的數量,並輸出

intmain()

void

input()

}void

exedp()}}

}void

output()

printf("%d

",time);

}

二、母函式求解設輸入的質量為w的砝碼n個,則可以用母函式表示為:

針對本題目,例如輸入六種砝碼(1g,2g,3g,5g,10g,20g)的個數分別為:1,2,2,0,0,1。則有:

用matlab軟體的符號計算有:

>>syms x;

>> f1=(1+x);

>> f2=(1+x^2+x^4

);>> f3=(1+x^3+x^6

);>> f4=(1+x^20

);>> expand(f1*f2*f3*f4)

>>ans=

x^31 + x^30 + x^29 + 2*x^28 + 2*x^27 + 2*x^26 + 2*x^25 + 2*x^24 + 2*x^23 + x^22 + x^21 + x^20 + x^11 + x^10 + x^9 + 2*x^8 + 2*x^7 + 2*x^6 + 2*x^5 + 2*x^4 + 2*x^3 + x^2 + x + 1

其中x的指數就是能夠稱出的質量,可知可以稱出的不同質量個數為23個。

動態規劃 砝碼稱重問題

動態規劃 dynamic programming 這個詞乍一聽感覺甚是高大上,初次學習或者使用的時候會感覺難以理解,這是正常的,畢竟凡事都是一回生二回熟。其實它也不難的,大家要明白乙個道理,能寫到課本上給學生學習的東西必然屬於不難的東西,因為太難的東西寫到課本上讀者接受不了,這本書就沒有出版的意義了...

動態規劃 砝碼稱重問題

一 演算法分析 動態規劃 dynamic programming 這個詞乍一聽感覺甚是高大上,初次學習或者使用的時候會感覺難以理解,這是正常的,畢竟凡事都是一回生二回熟。其實它也不難的,大家要明白乙個道理,能寫到課本上給學生學習的東西必然屬於不難的東西,因為太難的東西寫到課本上讀者接受不了,這本書就...

動態規劃 砝碼稱重

問題描述 設有1g,2g,3g,5g,10g,20g的砝碼各若干枚 其總重 1000g 要求 輸入 a1 a2 a3 a4 a5 a6 表示1g砝碼有a1個,2g砝碼有a2個,20g砝碼有a6個 輸出 total n n表示用這些砝碼能稱出的不同重量的個數,但不包括乙個砝碼也不用的情況 輸入樣例 1...