開心的小明——動態規劃

問題描述:

小明今天很開心,家裏購置的新房就要領鑰匙了,新房裏有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:“你的房間需要購買哪些物品,怎麼佈置,你說了算,只要不超過N元錢就行”。今天一早小明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的N元。

於是,他把每件物品規定了一個重要度,分爲5等:用整數1~5表示,第5等最重要。他還從因特網上查到了每件物品的價格(都是整數元)。他希望在不超過N元(可以等於N元)的前提下,使每件物品的價格與重要度的乘積的總和最大。

設第j件物品的價格爲v[j],重要度爲w[j],共選中了k件物品,編號依次爲j1j2,……,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;
	}
} 

	

發佈了31 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章