金明的预算方案(洛谷-P1064)
題目描述
金明今天很開心,家里購置的新房就要領(lǐng)鑰匙了,新房里有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:“你的房間需要購買哪些物品,怎么布置,你說了算,只要不超過?NN?元錢就行”。今天一早,金明就開始做預(yù)算了,他把想買的物品分為兩類:主件與附件,附件是從屬于某個(gè)主件的,下表就是一些主件與附件的例子:
主件 附件
電腦 打印機(jī),掃描儀
書柜 圖書
書桌 臺燈,文具
工作椅 無
如果要買歸類為附件的物品,必須先買該附件所屬的主件。每個(gè)主件可以有 0?個(gè)、?1?個(gè)或?2?個(gè)附件。附件不再有從屬于自己的附件。金明想買的東西很多,肯定會超過媽媽限定的?N?元。于是,他把每件物品規(guī)定了一個(gè)重要度,分為?5?等:用整數(shù)?1?5?表示,第?5?等最重要。他還從因特網(wǎng)上查到了每件物品的價(jià)格(都是?10?元的整數(shù)倍)。他希望在不超過?N?元(可以等于?NN?元)的前提下,使每件物品的價(jià)格與重要度的乘積的總和最大。
設(shè)第?jj?件物品的價(jià)格為?v[?j]?,重要度為?w[?j]?,共選中了?k?件物品,編號依次為?j1?,j2?,…,jk??,則所求的總和為:
v[?j1?]×w[?j1?]+v[?j2?]×w[?j2?]+…+v[?jk?]×w[?jk?]?。
請你幫助金明設(shè)計(jì)一個(gè)滿足要求的購物單。
輸入輸出格式
輸入格式:
第?1?行,為兩個(gè)正整數(shù),用一個(gè)空格隔開:
Nm?(其中 N(<32000)?表示總錢數(shù), m(<60)?為希望購買物品的個(gè)數(shù)。) 從第?2?行到第?m+1行,第?j?行給出了編號為?j?1?的物品的基本數(shù)據(jù),每行有?3?個(gè)非負(fù)整數(shù)
v p q?(其中?v?表示該物品的價(jià)格(?v<10000?),p表示該物品的重要度(?1?5?),?q?表示該物品是主件還是附件。如果?q=0?,表示該物品為主件,如果?q>0?,表示該物品為附件,?q 是所屬主件的編號)
輸出格式:
一個(gè)正整數(shù),為不超過總錢數(shù)的物品的價(jià)格與重要度乘積的總和的最大值(?<200000?)。
輸入輸出樣例
輸入樣例#1:
1000 5
800 2 0
400 5 1
300 5 1
400 3 0
500 2 0
輸出樣例#1:
2200
思路:有依賴的背包問題模板題,關(guān)于有依賴的背包問題:點(diǎn)擊這里
源代碼
#include<iostream> using namespace std; int dp[10000000]; struct main_goods{//主件結(jié)構(gòu)體int price;int weigh; }master[1000]; struct attachment_goods{//附件結(jié)構(gòu)體int price;int weigh; }attachment[1000][3]; int max(int x,int y)//比較函數(shù) {if(x>y) return x;else return y; } int main() {int money,num;int v,p,q; int i,j;cin>>money>>num;//最大錢數(shù)與數(shù)量for(i=1;i<=num;i++){cin>>v>>p>>q;//每件物品的價(jià)格、重要度、判斷主、附件if(q==0)//主件{master[i].price=v;//價(jià)格master[i].weigh=v*p;//乘積}else//附件{attachment[q][0].price++;//第二維用于記錄所屬主件的編號:0,1,2attachment[q][ attachment[q][0].price ].price=v;//價(jià)格attachment[q][ attachment[q][0].price ].weigh=v*p;//乘積}}for(i=1;i<=num;i++)//比較每件物品{for( j=money ; j>=master[i].price && j>0 ; j-- )//從當(dāng)前錢數(shù)開始比較,直至剩余錢數(shù)大于等于當(dāng)前物品價(jià)格即可{/*只買主件*/dp[j]=max(dp[j],dp[j-master[i].price]+master[i].weigh); /*買主件與第一個(gè)附件*/if (j>=master[i].price+attachment[i][1].price)dp[j]=max(dp[j],dp[j-master[i].price-attachment[i][1].price]+master[i].weigh+attachment[i][1].weigh); /*買主件與第二個(gè)附件*/if (j>=master[i].price+attachment[i][2].price)dp[j]=max(dp[j],dp[j-master[i].price-attachment[i][2].price]+master[i].weigh+attachment[i][2].weigh); /*買主件與第一、第二個(gè)附件*/if (j>=master[i].price+attachment[i][1].price+attachment[i][2].price)dp[j]=max(dp[j],dp[j-master[i].price-attachment[i][1].price-attachment[i][2].price]+master[i].weigh+attachment[i][1].weigh+attachment[i][2].weigh);}}cout<<dp[money]<<endl;return 0; }?
總結(jié)
以上是生活随笔為你收集整理的金明的预算方案(洛谷-P1064)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Charm Bracelet(信息学奥赛
- 下一篇: Find the safest road