時間限制:1000 ms | 記憶體限制:65535 kb
難度:4
描述小明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:「你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行」。今天一早小明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的n 元。於是,他把每件物品規定了乙個重要度,分為5 等:用整數1~5 表示,第5 等最重要。他還從網際網路上查到了每件物品的**(都是整數元)。他希望在不超過n 元(可以等於n 元)的前提下,使每件物品的**與重要度的乘積的總和最大。設第j 件物品的**為v[j],重要度為w[j],共選中了k 件物品,編號依次為j1...jk,則所求的總和為:v[j1]*w[j1]+..+v[jk]*w[jk]請你幫助金明設計乙個滿足要求的購物單.
輸入第一行輸入乙個整數n(0
輸出每組測試資料輸出只有乙個正整數,為不超過總錢數的物品的**與重要度乘積的總和的
最大值(<100000000)
樣例輸入
1樣例輸出1000 5
800 2
400 5
300 5
400 3
200 2
3900此題屬於01揹包問題,核心為01揹包的的狀態轉換方程 就此題來說設p[i]為物體的錢數,z[i]為物體的重要度,另設一陣列dp[i],n為所持有的總錢數,m為要購買物品的總件數 則此題的轉換方程為 dp[n]=max(dp[i],dp[n-p[i]]+z[i]*p[i]) 解釋一下:當比較每一組資料時揹包容量都從n開始變化,到這組資料的價錢數處結束,拿第一組資料來說,**為800,重要度為2,則揹包容量依次減小,到800處停下,此時陣列dp[800]到dp[1000]中已經被賦上初值了,然後比較第二組資料若第二組資料的結果比第一組資料大則用大的值覆蓋前邊小的值,以此類推 當然當後邊物品錢數和不超過n,則取和以求到最大值
附上ac**
#include#includeint main()
{ int dp[50000]; //注意這個表示價錢的陣列不能開的太小
int n,n,m,j,i;
int w[30],p[30];
scanf("%d",&n);
while(n--)
{ memset(dp,0,sizeof(dp));
scanf("%d %d",&n,&m);
for(i=0;i=w[i];j--)
{if(dp[j]
nyoj49 開心的小明
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 小明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早小明就開始做預算,但是他想買的東西太...
NYOJ 49 開心的小明
時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 小明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早小明就開始做預算,但是他想買的東西太...
NYOJ 49 開心的小明
開心的小明 時間限制 1000 ms 記憶體限制 65535 kb 難度 4 描述 小明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過n 元錢就行 今天一早小明就開始做預算,但是他...