AcWing 426 Happy Jin Ming

タイトル説明:

ジンミンは今日とても幸せです。彼が家で買った新しい家が鍵を受け取るところです。彼の新しい家にはとても広々とした部屋があります。

彼をさらに幸せにしているのは、彼の母親が昨日彼に言ったということです:「あなたはそれがN元を超えない限り、あなたはあなたの部屋でどんなアイテムを買う必要がありますか、どのように飾るか、あなたは最終決定権を持っています」。

ジンミンは今朝早く予算を立て始めたが、あまりにも多くのものを買いたかったので、それは間違いなく母親が許可したN元を超えるだろう。

したがって、彼は各項目の重要度を5つのレベルに分けて指定しました。整数1から5で表され、5番目のレベルが最も重要です。

彼はまた、インターネットから各アイテムの価格(すべて整数)をチェックしました。

彼は、価格と各アイテムの重要性の積の合計がN元(N元に等しい可能性がある)を超えないことを前提として最大化することを望んでいます。 

j番目のアイテムの価格をv [j]、重要度をw [j]とすると、合計k個のアイテムが選択され、その数はj1、j2、...、jkとなり、合計が得られます。は: 

v [j1] ∗ w [j1] + v [j2] ∗ w [j2] +…+ v [jk] ∗ w [jk] v [j1] ∗ w [j1] + v [j2] ∗ w [j2] +…+ V [jk] ∗ w [jk]

JinMingが要件を満たす買い物リストを設計するのを手伝ってください。

入力フォーマット

入力ファイルの最初の行は、スペースで区切られた2つの正の整数Nとmです。(ここで、Nは合計金額、mは購入したいアイテムの数です) 

2行目からm + 1行目まで、j行目はj-1の番号が付けられた項目の基本データを示し、各行には2つの非負の整数vとpがあります。(vはアイテムの価格を表し、pはアイテムの重要度を表します)

出力フォーマット

出力ファイルには正の整数が1つだけあります。これは、合計金額を超えない(データ保証結果が100000000を超えない)アイテムの価格と重要度の積の最大値です。

データ範囲

1≤N<30000、
1≤m<25、
0≤v≤10000、
1≤p≤5

入力サンプル:

1000 5
800 2
400 5
300 5
400 3
200 2

サンプル出力:

3900
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;
const int MAX = 30;
const int N = 30009;

int maxcost, n;
int w[MAX], v[MAX];
int dp[MAX][N];


int main()
{
    scanf("%d%d", &maxcost, &n);

    for(int i = 1; i <= n; i++)
        scanf("%d%d", &v[i], &w[i]);

    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= maxcost; j++)
        {
            if(v[i] > j)
                dp[i][j] = dp[i - 1][j];
            else
                dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - v[i]] + v[i] * w[i]);
        }
    }

    printf("%d\n", dp[n][maxcost]);
    return 0;
}

 

おすすめ

転載: blog.csdn.net/weixin_44620183/article/details/113766424