タイトル
リンク: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;
}