幸せJinmingアルゴリズムトレーニング
制限時間:メモリ制限が1.0S:256.0メガバイト
問題の説明
Jinming私の家族は、キーの必需品に新しい家を購入し、新しい部屋があり、非常に満足していますが、自分自身に非常に広々とした客室を捧げました。彼はさらに私の母は昨日ことを喜んと彼に言っなった:「あなたがライン上にNドルよりも、限りこれ以上、あなたが最終決定権を持っているか、レイアウト、購入するアイテムの部屋を必要とします」今朝Jinmingは、予算を始めたが、彼は確かに制限N母元を超えてしまいますので、多くのものを購入したいです。このように、彼は重要度を指定し、など5分割された各項目:1〜5は、最も重要ななど、第五、整数を示しました。彼はまた、インターネットからの各項目(整数ドルです)の価格を発見しました。彼は、N個の積の和の要素(要素がNに等しくてもよい)と、各アイテムの最大の価格の重要度を超えることなく望んでいます。
商品数J V [J]、重要W度[J]のための第一のセットの価格、J1、J2、...、JKとして順番に番号kの選択された項目の合計は、次いで、必要和である:
V [J1 ] * W [J1] + V [J2] * W [J2] + ... + V [JK] * [JK]ワット (*は乗算記号である場合には)
助けJinmingは、買い物リストの要件を満たすように設計してください。
入力形式
入力ファイルの1行目、2つの正の整数、スペースで区切られた:
NのM
(N(<30000)の合計金額を表し、M(<25)を購入したアイテムの所望の数まで)
から行M + 1、j行目の行2は、物品番号j-1を与える基本的なデータであり、各ラインは、整数2非負有する
VP
vはアイテムの価格(V <= 10000)を表し( 、p)は、物品(1〜5)の重要度を表します
出力形式の
製品の価格の重要度に最大出力ファイルのみ正の整数は、和のお金の項目の合計数を(<100 000 000)を超えていません。
サンプル入力
1000 5
800 2
400 5
300 5
400 3
200である2
サンプル出力
3900
スケールデータと規則
分析:セットでの総予算持つように前処理された要素の前提の漸化式があり、最大の価格及び取得した製品の項目の合計、の重要度を
#include <stdio.h>
int max(int a, int b)
{
return a > b ? a : b;
}
int main()
{
int N, m;
int v[30] = { 0 }, p[30] = { 0 };
int f[30][30005] = { 0 };
scanf("%d %d", &N, &m);
for (int i = 1; i <= m; ++i)
scanf("%d %d", &v[i], &p[i]);
for (int i = 1; i <= m; ++i)
{
for (int n = 0; n < v[i]; ++n)
f[i][n] = f[i-1][n];
for (int n = v[i]; n <= N; ++n)
f[i][n] = max(f[i-1][n], f[i-1][n-v[i]] + v[i] * p[i]);
}
printf("%d", f[m][N]);
return 0;
}