問題のあるT79222] [宝石のブレスレットへのソリューション

宝石用原石のブレスレット

慎重に、この質問は難しいことではありません正直に言うと、トピックを分析してください、おそらく普遍的な-難易
騒ぎ、バーを視野に


まず第一に、我々は最初のトピックはどのように感じることです参照してください?このタイトルは、それがバックパックであると感じ、見なければならない
ベッシーがそれぞれの宝石は一つだけであるので、それはあります名高いです01バックパック
その問題は、単純で
01バックパックとコアコード状態遷移方程式:
↓↓↓以下
1ない最適化:

\(DP [I] [J] = MAX(DP [I-1]〜[J-W [I] + C [i]は、DP [I] [J])\)

for(int i=1; i<=n; i++)
        for(int j=m; j>=c[i]; j--) dp[i][j] = max(dp[i-1][j-c[i]] + w[i] , dp[i][j]) ;

2.一次元アレイの最適化

\(DP [J] = MAX(DP [J-W [I] + C [i]は、DP [J])\)

for(int i=1; i<=n; i++)
    for(int j=m; j>=c[i]; j--) dp[j] = max(dp[j-c[i]] + w[i] , dp[j]) ;

この問題において、\(m個\)バックパックの、すなわち最大容量、\(N- \)商品アイテムの数であり、\(W_i、C_I \)は、物品、値の重みであり、
由来(\ AC \)コード:

#include<bits/stdc++.h>
using namespace std;
int v,n,w[220005],f[220005],c[220005],ans;
int read() //快读(QuickRead)
{
     int x=0,f=1;char ch=getchar();
     while(ch<'0'||ch>'9') {if(ch=='-') f=-1; ch=getchar();}
     while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
     return x*f;
}
int main()
{
    n=read();
    v=read();
    for(int i=1;i<=n;i++)
    {
        w[i]=read();
        c[i]=read();
    }
    for(int i=1;i<=n;i++)           
     for(int j=v;j>=w[i];j--)
        f[j]=max(f[j],f[j-w[i]]+c[i]);
    cout<<f[v];
}

どこに\(49-51 \)コアコードなど。
だから、この質問は幸せだろう(AC \)\ \(!\)

\(QAQ \)

おすすめ

転載: www.cnblogs.com/Luke-Skywalker/p/11227601.html