牛乗客チャレンジ(バックパックをグループ化)34のA.エンジェル願い

タイトル

リンク:https://ac.nowcoder.com/acm/contest/2271/A
出典:牛オフネットワーク

N店の直線均一な分布では、各店舗が販売する銃Mを持っている私はオンラインショッピング(?)に予定して、あなたは、あなた自身の銃を買いに行きたくない
銃パイ、j個の元を必要とし、i番目のショップでJを購入します。店で購入したが、Yガンよりも小さい場合、銃は、この店でYとより多くの購入は、送料無料とさせことができるかどうか有料に別途送料が、元の愛が必要です。
また、各店舗にのみ購入することができますが、各店舗で、ほとんどの注文を意味し、一度
今入れ銃の天使がKに望んでいることができますどのくらい、Kは、最小コストのピストルを購入する(総費用=総無料+合計購入コスト)?
ピストルはKを購入することができることを保証しながらもちろん、天使は浪費のように、そう、より多くのKピストルより購入しないでくださいしません。

説明を入力します。

エントリー

5 8 10 3
10 20 100 5 1
1 3 5 7 9 11 13 15
2 4 6 8 10 12 14 16
1 2 3 4 5 6 7 8
1 3 6 10 15 21 28 36
10 20 30 40 50 60 70 80

輸出

12

アイデア:

パケットバックパック、DP [I] [J]フロントI群、最大コストJ、達成することができる最小値意味
DPを[I] [J] =分(DP [I-1] [j]は、DP [I-1] [チュ] + P [I] [U])(1 <= U <= M)

コード:

#include<bits/stdc++.h>
#define LL long long
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
const int maxn=805;
int N,M,K,Y;
LL a[maxn],p[maxn][maxn];
LL dp[maxn][maxn];
int main()
{
    ios::sync_with_stdio(false);
    cin>>N>>M>>K>>Y;
    for(int i=1;i<=N;i++)
        cin>>a[i];
    for(int i=1;i<=N;i++)
    {
        for(int j=1;j<=M;j++)
        {
            cin>>p[i][j];
            if(j<Y)
            {
                p[i][j]+=j*a[i];
            }
        }
        
    }
    memset(dp,0,sizeof(dp));
    for(int i=0;i<maxn;i++)
        dp[0][i]=INF;
    for(int i=1;i<=N;i++)
    {
        for(int j=0;j<=K;j++)
        {
            for(int u=1;u<=M;u++)
            {
                if(j>=u)
                    dp[i][j]=min(dp[i-1][j],dp[i-1][j-u]+p[i][u]);
            }
        }
    }
    cout << dp[N][K] << endl;
    return 0;
}

おすすめ

転載: www.cnblogs.com/wwwlps/p/11978320.html