砝碼稱重問題:設有1g、2g
、3g、5g
、10g
、20g
的砝碼各若干枚(其質量
<=1000g
),求出用他們能稱出的質量的種類數(不包括質量為0的情況)。
一、動態規劃方法求解
設dp[1000]陣列為標記陣列。當dp[i]=0時,表示質量為i的情況,目前沒有稱出;當dp[i]=1時,表示質量為i的情況已經稱出。
本題目中有多個砝碼,我們順序處理每乙個砝碼。
當處理第j個砝碼,質量為wj時,有下列推導公式:
完整程式**如下:
#include#include二、母函式求解設輸入的質量為w的砝碼n個,則可以用母函式表示為: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);
}
針對本題目,例如輸入六種砝碼(1g,2g,3g,5g,10g,20g)的個數分別為:1,2,2,0,0,1。則有:
用matlab軟體的符號計算有:
>>syms x;其中x的指數就是能夠稱出的質量,可知可以稱出的不同質量個數為23個。>> 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
動態規劃 砝碼稱重問題
動態規劃 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...