金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:「你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n元錢就行」。今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n元。於是,他把每件物品規定了乙個重要度,分為5等:用整數1~5表示,第5等最重要。他還從網際網路上查到了每件物品的**(都是整數元)。他希望在不超過n元(可以等於n元)的前提下,使每件物品的**與重要度的乘積的總和最大。
樣例輸入
1000 5
800 2
400 5
300 5
400 3
200 2
樣例輸出
3900
思路介紹:
在寫這個題之前我希望你們先點一下鏈結看一下這個關於採藥的問題,這個問題和這個題的意思大致是和上面一樣的,
就拿上面的例子來看吧
1000 5(限制條件)
800 2
400 5
300 5
400 3
200 2
我們首先建立乙個二維陣列array[6][2];如下所示:00
0行800
2*800
1行400
5*400
2行300
5*300
3行400
3*400
4行200
2 *200
5行這是事先要完成的,然後我們可以再建立乙個二維陣列bb[ 5+1][1000+1 ]
如果bb[i][j]代表的意思是不超過j元錢,前i件物品可以取得的最大值
那麼很明顯bb[i][0]=0,bb[0][j]=0
假設wj代表的是第j件物品的價值,vj表示第j件物品的錢數,那麼如果wj>j的時候bb[i][j]=bb[i-1][j],因為時候第j件物品的價值已經超過了可容納的價值了,所以等於bb[i-1][j],
如果wjj)
sm[i][j]=sm[i-1][j];
else
sm[i][j]=max(sm[i-1][j],sm[i-1][j-array[i][0]]+array[i][1]);
system.out.println(sm[b][a]);
} public static int max(int i, int j)
}
動態規劃經典例子
求第一層到最後一層的路徑,將該路徑上的所有數字相加後得到的和最大是多少。include using namespace std const int maxn 1000 int f maxn maxn dp maxn maxn int main for int i 1 i n i for int i ...
動態規劃經典例子
總公司擁有高效裝置m臺,準備分給下屬的n個分公司。各分公司若獲得這些裝置,可以為國家提供一定的盈利。問 如何分配這m臺裝置才能使國家得到的盈利最大?求出最大盈利值。其中m 15,n 10。分配原則 每個公司有權獲得任意數目的裝置,但總台數不超過裝置數m。輸入格式 第一行有兩個數,第乙個數是分公司數n...
動態規劃例子
對於由從1到n 1 n 39 這n個連續的整數組成的集合來說,我們有時可以將集合分成兩個部分和相同的子集合。例如,n 3時,可以將集合 分為和。此時稱有一種方式 即與順序無關 n 7時,共有四種方式可以將集合 分為兩個部分和相同的子集合 和 和 和 和 輸入 程式從標準輸入讀入資料,只有一組測試用例...