動態規劃(1):01揹包

1200: VIJOS-P1334
時間限制: 0 Sec 內存限制: 128 MB
提交: 1 解決: 1
[提交][狀態][討論版][命題人:外部導入]
題目描述

航天飛機的體積有限,當然如果載過重的物品,燃料會浪費很多錢, 每件食品都有各自的體積、質量以及所含卡路里,在告訴你體積 和質量的最大值的情況下,請輸出能達到的食品方案所含卡路里 的最大值,當然每個食品只能使用一次.

輸入

第一行 兩個數 體積最大值(< 400)和質量最大值(< 400) 第二行 一個數 食品總數N(< 50). 第三行-第3+N行 每行三個數 體積(< 400) 質量(< 400) 所含卡路里(< 500)

輸出

一個數 所能達到的最大卡路里(int範圍內)

樣例輸入
320 350
4
160 40 120
80 110 240
220 70 310
40 400 220

樣例輸出
550
思路:01揹包;

#include<iostream>
#include<algorithm>
#include<cstring>
const int maxn=55;
int a[maxn],b[maxn],c[maxn];
int f[401][401]; 
using namespace std;
int main()
{
    int Vmax,Mmax,n;
    memset(f,0,sizeof(f));\\初值0cin>>Vmax>>Mmax;
    cin>>n;
    int i,j,k;
    for(i=1;i<=n;i++)
    {
        cin>>a[i]>>b[i]>>c[i];\\體積,質量,價值;
    }
    for(k=1;k<=n;k++)
    {
    for(i=Vmax;i>=a[k];i--)//體,打一個只有k=1,2,,,i的表
    for(j=Mmax;j>=b[k];j--)//質
    {
        f[i][j]=max(f[i][j],f[i-a[k]][j-b[k]]+c[k]); \\相當於01揹包的那個表;max比較,得最優;
    }
    }
    cout<<f[Vmax][Mmax]<<endl;\\輸出最大容積,質量時
 } 

1182: VIJOS-P1313
時間限制: 1 Sec 內存限制: 128 MB
提交: 3 解決: 0
[提交][狀態][討論版][命題人:外部導入]
題目描述

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

輸入

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

輸出

      輸出文件只有一個正整數,爲不超過總錢數的物品的價格與重要度乘積的總和的最大值 (< 200000)。 
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
struct NODE{
    int price;
    int imp;
    int ci;
}a[65];
int ci[65];
int dp[32010];
int main()
{
    int n,m;
    cin>>n>>m;
    memset(dp,0,sizeof(dp));

    for(int i=1;i<=m;i++)
    {
        cin>>a[i].price>>a[i].imp>>a[i].ci; 
        if(a[i].ci)
        {
            if(ci[0])
            {
                ci[1]=a[i].ci;
            }
            else ci[0]=a[i].ci;
        }
   }
    for(int i=1;i<=m;i++)
    {
        for(int j=n;j>=a[i].price;j--)
        {
            if(!a[i].ci)
            {
                dp[j]=max(dp[j],dp[j-a[i].price]+a[i].imp*a[i].price);
            }
            if(j&&ci[0]&&(j-a[i].price-a[ci[0]].price)>=0)dp[j]=max(dp[j],dp[j-a[i].price-a[ci[0]].price]+a[ci[0]].price*a[ci[0]].imp+a[i].imp*a[i].price);
            if(j&&ci[1]&&(j-a[i].price-a[ci[1]].price)>=0)dp[j]=max(dp[j],dp[j-a[i].price-a[ci[1]].price]+a[ci[1]].price*a[ci[1]].imp+a[i].imp*a[i].price);
            if(j&&ci[1]&&ci[0]&&(j-a[i].price-a[ci[0]].price-a[ci[1]].price)>=0)dp[j]=max(dp[j],dp[j-a[i].price-a[ci[0]].price-a[ci[1]].price]+a[ci[0]].price*a[ci[0]].imp+a[ci[1]].price*a[ci[1]].imp+a[i].imp*a[i].price);
        }
    }
    cout<<dp[n]<<endl;
 } 

1186: VIJOS-P1317
時間限制: 0 Sec 內存限制: 128 MB
提交: 10 解決: 0
[提交][狀態][討論版][命題人:外部導入]
題目描述

金明今天很開心,家裏購置的新房就要領鑰匙了,新房裏有一間他自己專用的很寬敞的房間。更讓他高興的是,媽媽昨天對他說:“你的房間需要購買哪些物品,怎麼佈置,你說了算,只要不超過N 元錢就行”。今天一早金明就開始做預算,但是他想買的東西太多了,肯定會超過媽媽限定的N 元。於是,他把每件物品規定了一個重要度,分爲5 等:用整數1~5 表示,第5 等最重要。他還從因特網上查到了每件物品的價格(都是整數元)。他希望在不超過N 元(可以等於N 元)的前提下,使每件物品的價格與重要度的乘積的總和最大。設第j 件物品的價格爲v[j],重要度爲w[j],共選中了k 件物品,編號依次爲j1…jk,則所求的總和爲:v[j1]*w[j1]+..+v[jk]*w[jk]請你幫助金明設計一個滿足要求的購物單.

輸入

輸入的第1 行,爲兩個正整數,用一個空格隔開: N m (其中N(< 30000)表示總錢數,m(< 25)爲希望購買物品的個數。) 從第2 行到第m+1 行,第j 行給出了編號爲j1 的物品的基本數據,每行有2 個非負整數 v p (其中v 表示該物品的價格(v≤10000),p 表示該物品的重要度(1~5))

輸出

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

樣例輸入
1000 5
800 2
400 5
300 5
400 3
200 2

樣例輸出
3900


2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
struct NODE{
    int price;
    int imp;
}a[30],t;
long long int hu[40],f[30010];
int main()
{
    int n,m;
    char ch;
    cin>>n>>m; 
    {
    for(int i=1;i<=m;i++)
    {
        cin>>a[i].price>>a[i].imp;
    }
    for(int i=1;i<=m;i++)
    {
       hu[i]=a[i].imp*a[i].price;
    }
    memset(f,0,sizeof(f));
    for(int i=1;i<=m;i++)
    {
        for(int j=n;j>=a[i].price;j--)
        {
            f[j]=max(f[j],f[j-a[i].price]+hu[i]);
        }
    }
    cout<<f[n]<<endl;
    } 
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章