金明今天很開心,家裏購置的新房就要領鑰匙了,新房裏有一間他本身專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:「你的房間須要購買哪些物品,怎麼佈置,你說了算,只要不超過N 元錢就行」。今天一早金明就開始作預算,可是他想買的東西太多了,確定會超過媽媽限定的N 元。因而,他把每件物品規定了一個重要度,分爲5 等:用整數1~5 表示,第5 等最重要。他還從因特網上查到了每件物品的價格(都是整數元)。他但願在不超過N 元(能夠等於N 元)的前提下,使每件物品的價格與重要度的乘積的總和最大。設第j 件物品的價格爲v[j],重要度爲w[j],共選中了k 件物品,編號依次爲j1...jk,則所求的總和爲:v[j1]*w[j1]+..+v[jk]*w[jk]請你幫助金明設計一個知足要求的購物單.node
輸入的第1 行,爲兩個正整數,用一個空格隔開:ios
N mide
(其中N(<30000)表示總錢數,m(<25)爲但願購買物品的個數。)spa
從第2 行到第m+1 行,第j 行給出了編號爲j-1設計
的物品的基本數據,每行有2 個非負整數code
v pblog
(其中v 表示該物品的價格(v≤10000),p 表示該物品的重要度(1~5))ci
輸出只有一個正整數,爲不超過總錢數的物品的價格與重要度乘積的總和的it
最大值(<100000000)io
1000 5
800 2
400 5
300 5
400 3
200 2
3900
這種題目一看就是揹包問題,可是我剛開始毅然決然的仍是用貪心作的,因此只有30';
這題是01揹包的變形 ,狀態轉移方程:f[j]=max{f[j],f[j-w[i]]+w[i]*v[i]};
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 struct node{ 5 int v, w, s; 6 }t[40010]; 7 int f[40010]; 8 int main(){ 9 int n, m; 10 cin >> n >> m; 11 for(int i = 1; i <= m; i++){ 12 int x, y; 13 cin >> x >> y; 14 t[i].v = x; t[i].w = y; t[i].s = x * y; 15 } 16 for(int i = 1; i <= m; i++){ 17 for(int j = n; j >= t[i].v; j--){ 18 f[j] = max(f[j], f[j - t[i].v] + t[i].s); 19 } 20 } 21 cout << f[n] << endl; 22 return 0; 23 }