NOIP 2006 金明的預算方案 動態規劃

2021-07-05 11:51:54 字數 1680 閱讀 7524

金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。

更讓他高興的是,媽媽昨天對他說:「你的房間需要購買哪些物品,怎麼布置,你說了算,只要不

超過 n 元錢就行」。今天一早,金明就開始做預算了,他把想買的物品分為兩類:主件與附件,附件是從屬於某個主件的,下表就是一些主件與附件的例子:

如果要買歸類為附件的物品,必須先買該附件所屬的主件。每個主件可以有 0 個、1 個或 2個附件。附件不再有從屬於自己的附件。金明想買的東西很多,肯定會超過媽媽限定的 n 元。於是,

他把每件物品規定了乙個重要度,分為 5 等:用整數 1~5 表示,第 5 等最重要。他還從網際網路上查到了每件物品的**(都是 10 元的整數倍)。他希望在不超過 n 元(可以等於 n 元)的前提下,使每件物品的**與重要度的乘積的總和最大。

設第 j 件物品的**為 v[j],重要度為 w[j],共選中了 k 件物品,編號依次為 j1,j2,„„,jk,則所求的總和為:

v[j1]*w[j1]+v[j2]*w[j2]+ „+v[jk]*w[jk]。(其中*為乘號)

請你幫助金明設計乙個滿足要求的購物單。

輸入檔案 budget.in 的第 1 行,為兩個正整數,用乙個空格隔開:

n m(其中 n(<32000)表示總錢數,m(<60)為希望購買物品的個數。)

從第 2 行到第 m+1 行,第 j 行給出了編號為 j-1 的物品的基本資料,每行有 3 個非負整數v p q(其中 v 表示該物品的**(v<10000),p 表示該物品重要度(1~5),q 表示該物品是主件還是附件。如果 q=0,表示該物品為主件,如果 q>0,表示該物品為附件,q 是所屬主件的編號)

** 輸出檔案 budget.out 只有乙個正整數,為不超過總錢數的物品的**與重要度乘積的總和的最大值(<200000)。

** budget.in budget.out

** 1000 5 2200

800 2 0

400 5 1

300 5 1

400 3 0

500 2 0

** 樹形dp運算量太大

orz這裡

還orz這裡

神犇在我就不bibi惹……

#include 

#include

using namespace std;

const int maxn=61;

int n,m,mx=0;

int a,b,q;

int v[maxn],v1[maxn],v2[maxn];

int p[maxn],p1[maxn],p2[maxn];

int f[50001];

int main()

else

}else

}for(int i=1;i<=n;i++)

for(int j=m;j>=v[i];j--)

printf("%d",mx*10);

return

0;}

——既然選擇了遠方,便只顧風雨兼程

有錯誤歡迎各神犇指正~qaq

NOIP2006 金明的預算方案

1 金明的預算方案 問題描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說 你的房間需要購買哪些物品,怎麼布置,你說了算,只要不 超過n元錢就行 今天一早,金明就開始做預算了,他把想買的物品分為兩類 主件與附件,附件是從屬於某個主...

NOIP2006 金明的預算方案 揹包DP

樣例輸入 sample input 1000 5 800 2 0 400 5 1 300 5 1 400 3 0 500 2 0 樣例輸出 sample output 2200 並茂2333 不 乙個簡單的01揹包變形。本來我想當挑附件的時候看看能不能挑主件,結果好像不能重複選同乙個主件 所以我們就...

NOIP提高組2006 金明的預算方案

揹包公升級版 附帶從屬關係 因為從屬關係很少 所以強行把兒子綁在爸爸上dp 故必須dp倆維 dp 局數 代價 把兒子方案們放在同一局,由上一局轉移,使其不能相互影響 include include include include include include include includeusin...