A - 高數Umaru系列(9)——哈士奇

mxqsgxxn發表於2020-11-29

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

Input 多組輸入。

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

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

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

Sample Input 2 100 50 20 60 40 3 100 20 55 20 35 90 95 1 10 20 50
Output
40
95
0

0-1揹包
dp[i][j]表示能用價錢j買下的前i只狗的最大萌值。
如果價錢能夠買當前狗,分成買和不買兩種情況,dp[i][j]=max(dp[i-1][j-p[i]]+m[i],dp[i-1][j])。
如果買,dp[i-1][j-p[i]]+m[i],也就是買下第i只狗後的萌值=從前i-1狗中得到的最大萌值+第i只狗的萌值,買下後價錢j-p[i]。
如果不買,dp[i-1][j]到第i只狗的萌值=從前i-1狗中得到的最大萌值。

#include<bits/stdc++.h>
using namespace std;
int dp[105][1005];
int p[105],m[105];
int main()
{
    int n,x;
    while(cin>>n>>x)
    {
        for(int i=1; i<=n; i++)
        {
            cin>>p[i]>>m[i];
        }
        memset(dp,0,sizeof(dp));
        for(int i=1; i<=n; i++)
        {
            for(int j=0; j<=x;j++)
            {
                if(j>=p[i])
                {
                    dp[i][j]=max(dp[i-1][j-p[i]]+m[i],dp[i-1][j]);
                }
                else
                    dp[i][j]=dp[i-1][j];
            }
        }
        cout<<dp[n][x]<<endl;
    }
    return 0;
}

相關文章