動態規劃 分組的揹包 金明的預算方案

2021-08-02 05:48:42 字數 2329 閱讀 7711

金明的預算方案

總時間限制: 10000ms 單個測試點時間限制: 1000ms 記憶體限制: 65536kb

描述 金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:「你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過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)。

樣例輸入

1000 5

800 2 0

400 5 1

300 5 1

400 3 0

500 2 0

樣例輸出

2200

一定要看題:這道題說最多只有兩個子件,且子件沒有子件,所以完全可以把這道題當作分組揹包來做。至於通用的做法這裡不講,以後學了再說。

還要注意的是,由於limit是10的倍數,因此除以10是完全沒有問題的,理論上來說速度能提公升十倍吧。

參考**

#include 

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

using

std::cin;

using

std::cout;

using

std::endl;

int limit;

int n;

struct object_base

};struct object:public object_base

} objects[65];

namespace regular

cost=objects[i].cost+objects[i].child1.cost;

value=objects[i].value+objects[i].child1.value;

for(int j=limit; j>=cost; j--)

cost=objects[i].cost+objects[i].child2.cost;

value=objects[i].value+objects[i].child2.value;

for(int j=limit; j>=cost; j--)

cost=objects[i].cost+objects[i].child1.cost+objects[i].child2.cost;

value=objects[i].value+objects[i].child1.value+objects[i].child2.value;

for(int j=limit; j>=cost; j--)

for(int i=0; i<=limit; i++)

}printf("%d\n",f[limit]);

}void input()

else

if(!objects[parent].child2.cost)}}

}}int main()

演算法 揹包 金明的預算方案

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

動態規劃 分組揹包

問題 有n件物品,告訴你這n件物品的重量以及價值,將這些物品劃分為k組,每組中的物品互相衝突,最多選一件,求解將哪些物品裝入揹包可使這些物品的費用綜合不超過揹包的容量,且價值總和最大。演算法 首先判斷乙個分組當中的一件物品,同01揹包一樣,此物品存在兩種狀態,取與不取,若取此物品,則繼續判斷下一組的...

動態規劃 金明的預算方案

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