1. 程式人生 > >01揹包-01 高數Umaru系列(9)——哈士奇

01揹包-01 高數Umaru系列(9)——哈士奇

高數奧馬魯系列(9) - 哈士奇

時間限制:1000毫秒記憶體限制:65536 KiB

提交 統計資訊

問題描述

由於高數巨養的喵星人太傲嬌了,要天天吃新鮮貓糧而且還經常欺負高數巨,所以高數巨決定買幾條哈士奇嚐嚐鮮。這天高數巨來到了二手狗市場買哈士奇,高數巨看完了所有的哈士奇,記下了每條哈士奇的價格,並根據對它們的好感程度給它們每隻都賦予了一個萌值。高數現在手裡有X元,她想通過購買若干條哈士奇來獲得儘可能多的萌值。現在給定高數巨手裡的錢X以及ñ條哈士奇的價格和萌值,求高數巨最多可獲得多少萌值

輸入

 多組輸入。

對於每組輸入,第一行有兩個整數N,X(1 <= N <= 100,1 <= X <= 1000),分別表示哈士奇的數量和高數巨的錢數

接下來的N行每行有兩個整數Pi,Mi(1 <= Pi,Mi <= 100),分別表示第i條哈士奇的價格和萌值

產量

對於每組資料,輸出一個整數,表示高數巨最多可以獲得的萌值,每組輸出佔一行

樣本輸入

2 100
50 20
60 40
3 100
20 55
20 35
90 95
1 10
20 50

樣本輸出

40
95
0

暗示

 

資源

夏農

AC程式碼:二維陣列

#include <bits/stdc++.h>
using namespace std;
int a[111],b[111];
int main()
{
    int n,x;
    while (cin>>n>>x)
    {
        int dp[111][1111]={0};
        for (int i=1;i<=n;i++)
            cin>>a[i]>>b[i];
        for (int i=1;i<=n;i++)
        {
            for (int j=x;j>0;j--)
            {
                if (j>=a[i]) // 能裝
                    dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i]]+b[i]); // 比較裝與不裝誰的價值更大
                else // 裝不進
                    dp[i][j]=dp[i-1][j];
            }
        }
        cout<<dp[n][x]<<endl;
    }
    return 0;
}

AC程式碼:二維換一維

#include <bits/stdc++.h>
using namespace std;
int dp[1111];
int a[111], b[111];
int main()
{
    int n, x;

    while (~scanf("%d %d", &n, &x))
    {
        memset(dp, 0, sizeof(dp)); // 少重置錯
        for (int i = 0; i < n; i++)
        {
            scanf("%d %d", &a[i], &b[i]);
        }
        for (int i = 0; i < n; i++) // 遍歷哈士奇個數
        {
            for (int j = x; j >= 0; j--) // 遍歷剩餘的錢
            {
                if (j - a[i] >= 0)
                {
                    dp[j] = max(dp[j], dp[j - a[i]] + b[i]);
                }
            }
        }
        printf("%d\n", dp[x]);
    }
    return 0;
}