JZ初中OJ 2267. 寶物篩選


題目描述

          終於,破解了千年的難題。小 FF 找到了王室的寶物室,里面堆滿了無數價值連城的寶物……這下小 FF 可發財了,嘎嘎。但是這里的寶物實在是太多了,小FF 的采集車似乎裝不下那么多寶物。 看來小 FF 只能含淚舍棄其中的一部分寶物了……小FF 對洞穴里的寶物進行了整理,他發現每樣寶物都有一件或者多件。他粗略估算了下每樣寶物的價值,之后開始   了寶物篩選工作:
        小 FF 有一個最大載重為 W 的采集車, 洞穴里總共有 n 種寶物的,每種寶物的價值為v [i], 重量為 w[i], 每種寶物有 m[i]件。 小 FF 希望在采集車不超載的前提下,選擇一些寶物裝進采集車,使得它們的價值和最大。
 

輸入

      第一行為 2 整數 N 和 W,分別表示寶物種數和采集車的最大載重。
      接下來 n 行每行三個整數, 其中第 i 行第一個數表示第 i 類品價值, 第二個整數表示一件該類物品的重量, 第三個整數為該類物品數量。

輸出

輸出僅一個整數ans, 表示在采集車不超載的情況下收集的寶物的最大價值。
 

樣例輸入

4 20
3 9 3
5 9 1
9 4 2
8 1 3

樣例輸出

47
 

數據范圍限制

對於 30%的數據: n <=  ∑m[i] <= 10^4; 0 <= W <=10^3.
對於 100%的數據: n <= ∑m[i] <=10^5; 0<= W <=4 * 10^4;
                            1 <= n <= 100.
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int v[4*10005],w[4*10005];
 4 int f[4*10005];
 5 int n,m,nl;
 6 int main()
 7 {
 8     freopen("treasure.in","r",stdin);
 9     freopen("treasure.out","w",stdout);
10     cin>>n>>m;
11     for(int i=1;i<=n;i++)
12     {
13         int x,y,s,t=1;
14         cin>>y>>x>>s;
15         while(s>=t)
16         {
17             v[++nl]=x*t;
18             w[nl]=y*t;
19             s-=t;
20             t*=2;
21         }
22         v[++nl]=x*s;
23         w[nl]=y*s;
24     }
25     for(int i=1;i<=nl;i++)
26         for(int j=m;j>=v[i];j--)
27             f[j]=max(f[j],f[j-v[i]]+w[i]);
28     cout<<f[m];
29 }


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM