問題描述:
小明今天很開心,家裏購置的新房就要領鑰匙了,新房裏有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:“你的房間需要購買哪些物品,怎麼佈置,你說了算,只要不超過N元錢就行”。今天一早小明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的N元。
於是,他把每件物品規定了一個重要度,分爲5等:用整數1~5表示,第5等最重要。他還從因特網上查到了每件物品的價格(都是整數元)。他希望在不超過N元(可以等於N元)的前提下,使每件物品的價格與重要度的乘積的總和最大。
設第j件物品的價格爲v[j],重要度爲w[j],共選中了k件物品,編號依次爲j1,j2,……,jk,則所求的總和爲:
v[j1]*w[j1]+v[j2]*w[j2]+ …+v[jk]*w[jk]。(其中*爲乘號)
請你幫助小明設計一個滿足要求的購物單。
初看這個問題,和0-1揹包問題很相似,可以採用動態規劃方法來求解:什麼是動態規劃(DP)?
非常重要!,不要認爲概念不重要,理解的深刻,你才知道對於什麼樣的問題去考慮有沒有動態規劃的方法,以及如何去使用動態規劃。
1)動態規劃是運籌學中用於求解決策過程中的最優化數學方法。
當然,我們在這裏關注的是作爲一種算法設計技術,作爲一種使用多階段決策過程最優的通用方法。它是應用數學中用於解決某類最優化問題的重要工具。
2)如果問題是由交疊的子問題所構成,我們就可以用動態規劃技術來解決它,一般來說,這樣的子問題出現在對給定問題求解的遞推關係中,這個遞推關係包含了相同問題的更小子問題的解。動態規劃法建議,與其對交疊子問題一次又一次的求解,不如把每個較小子問題只求解一次並把結果記錄在表中(動態規劃也是空間換時間的),這樣就可以從表中得到原始問題的解。
由於動態規劃具備最優子結構的性質,這意味着它屬於遞歸的一種。
#include "OJ.h"
#include <stdlib.h>
int** initStateMatrix(int*p)
{
int** StateMatrix=(int **)malloc(sizeof(int*)*(*(p+1)));
int No=0,money=0;
//int 狀態矩陣
for(No=0;No<=*(p+1);No++)
{
StateMatrix[No]=(int*)malloc(*p*sizeof(int));
for(money=0;money<=*p;money++)
{
StateMatrix[No][money]=0;
}
}
for(No=1;No<=*(p+1);No++)
{
for(money=1;money<=*p;money++)
{
if(*(p+No*2)<=money)
{
StateMatrix[No][money]=StateMatrix[No-1][money]>(StateMatrix[No-1][money-*(p+No*2)]+(*(p+No*2)*(*(p+No*2+1))))?StateMatrix[No-1][money]:StateMatrix[No-1][money-*(p+No*2)]+(*(p+No*2)*(*(p+No*2+1)));
}
else StateMatrix[No][money]=StateMatrix[No-1][money];
}
}
return StateMatrix;
}
/*
功能:
輸入參數:int*p 指向二維數組的首地址,該二維數組第0行的兩個數分別表示:總錢數<30000,和希望購買物品的個數<25;
該數組從第1行到第m行(1<=j<=m)中給出了編號爲j的物品的基本數據,每行有2個非負整數,
表示該物品的價格(<=10000)和該物品的重要度(1~5)。
GetResult表示不超過總錢數的物品的價格與重要度乘積的總和的最大值(<100000000)。
不需做入參檢查,測試用例可以保證~
例如:4000 8(第0行)
821 3 (第1行)
422 5
458 5
500 3
200 2
430 4
530 3
239 3
則表示 總錢數爲4000,希望購買物品個數爲8個,因此從第1行到第8行表示編號爲j的物品的價格及物品的重要度。
返回值:無
溫馨提示:根據題意可知,該二維數組只有兩列,且行數爲第0行的第二個元素數值+1;入參p不能按照二維數組的方法來取值,要將
二維的轉換成一維的哦~
*/
void GetResult(int*p,int& Get_Result)
{
// 在這裏實現功能
int i;
int** StateMatrix=initStateMatrix(p);
for(int i=0;i<=*(p+1);i++)
{
Get_Result=StateMatrix[i][*p]>Get_Result?StateMatrix[i][*p]:Get_Result;
}
}