【POJ3624】チャームブレスレット(01バックパック)

説明

ベッシーはモールの宝石店に行き、チャームブレスレットをスパイしました。もちろん、彼女はN(1≤N≤3,402)の利用可能なチャームから可能な限り最高のチャームでそれを埋めたいと思っています。提供されたリストの各チャームiは、重みWi(1≤Wi≤400)、「望ましさ」係数Di(1≤Di≤100)を持ち、最大1回使用できます。Bessieは、重量がM(1≤M≤12,880)以下のチャームブレスレットのみをサポートできます。

制約としてのその重み制限と、それらの重みと望ましさの評価を含むチャームのリストを前提として、評価の可能な最大合計を推定します。

入力

  • 1行目:スペースで区切られた2つの整数:NとM
  • 2行目..N + 1:行i + 1は、スペースで区切られた2つの整数(WiとDi)を持つチャームiを表します。

出力

  • 1行目:重みの制約が与えられた場合に達成できるチャームの望ましさの最大の合計である単一の整数

サンプル入力

4 6
1 4
2 6
3 12
2 7

サンプル出力

23

配列は質問の指定されたサイズで開く必要があることに注意してください。そうすると、質問を見ずにREが発生します。

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"

using namespace std;

const int maxn = 12900;

int F[maxn][2];
int dp[maxn];

int max( int a,int b )
{
    return a>b? a:b;
}

int main()
{
    int n,m;
    memset(F,0,sizeof(F));
    while(~scanf("%d%d",&n,&m))
    {
        for( int i=1 ; i<=n ; i++ )
        {
            scanf("%d%d",&F[i][0],&F[i][1]);
        }
        memset(dp,0,sizeof(dp));
        for( int i=1 ; i<=n ; i++ )
           for( int j=m ; j>=F[i][0] ; j-- )
           {
            dp[j] = max( dp[j] , dp[j-F[i][0]]+F[i][1] );
           }
           printf("%d\n",dp[m]);
    }
    return 0;
}

おすすめ

転載: blog.csdn.net/thesprit/article/details/50958801