金明的預算方案

來源:互聯網
上載者:User

Description

金明今天很開心,家裡購置的新房就要領鑰匙了,新房裡有一間金明自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:“你的房間需要購買哪些物品,怎麼布置,你說了算,只要不超過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]。(其中*為乘號)請你協助金明設計一個滿足要求的購物單。

Input

輸入檔案的第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是所屬主件的編號)

Output

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

Sample Input

1000 5800 2 0400 5 1300 5 1400 3 0500 2 0

Sample Output

2200

 

#include<stdio.h>int v[70];int p[70];int q[70];int f[50000];int max(int a,int b){   return a > b ? a : b;   }int main(){int n,m;int i,j,k;int t1,t2;int k1,k2;int l=0;scanf("%d%d",&n,&m);for(i = 1; i <= m; i++){scanf("%d%d%d",&v[i],&p[i],&q[i]);}for(i = 1; i <= m; i++){    k1=0;k2=0;t1=0;t2=0;if(q[i]==0)  //要是主物件{for(k = i+1;k <= m; k++)if(q[k]==i)                       //找到附屬物品1{t1=k;k1=1;break;}for(k = t1+1;k <= m; k++)if(q[k]==i)                       //找到附屬物品2{t2=k;k2=1;break;} for(j = n; j >= v[i]; j--){f[j]=max(f[j-v[i]]+v[i]*p[i],f[j]);f[j]=max(f[j-v[i]]+v[i]*p[i],f[j]);   //只要主件或者都不要if((j-v[i]-v[t1])>=0&&k1==1)                         //要附件1f[j]=max(f[j-v[i]-v[t1]]+v[i]*p[i]+v[t1]*p[t1],f[j]);if((j-v[i]-v[t2])>=0&&k2==1)                                           //要附件2f[j]=max(f[j-v[i]-v[t2]]+v[i]*p[i]+v[t2]*p[t2],f[j]);if((j-v[i]-v[t1]-v[t2])>=0&&k1==1&&k2==1)                                           f[j]=max(f[j-v[i]-v[t1]-v[t2]]+v[i]*p[i]+v[t1]*p[t1]+v[t2]*p[t2],f[j]);}}}printf("%d\n",f[n]);return 0;}

題解:這題很容易看出是用背包問題解答。將此題轉換成0/1背包,解這題的關鍵就是把主件和附件綁在一起討論。又因為附件只有0,1,2,3種情況加上主件一起討論即可!

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.