タイトル説明:
ジンミンは今日とても幸せです。彼が家で買った新しい家が鍵を受け取るところです。彼の新しい家にはとても広々とした部屋があります。
彼をさらに幸せにしているのは、彼の母親が昨日彼に言ったということです:「あなたはそれが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;
}