QAQ好像最近hihocoder的题都可以暴力??
DP无脑枚举即可。。。
DP[i] 表示 表示建设值为i时的最少花费
那么对于N层都分开计算,计算DP[1..K]时
对于DP[j] 需要去遍历所有的B[p],更新方程为
dp[j]=min(dp[max(j-b[p],0LL)]+a[p],dp[j]);
max(j-b[p,0]) 是考虑到有些b特别大但划算的情况
#include <bits/stdc++.h>
using namespace std;
long long dp[10502];
long long a[105],b[105];
int main()
{
long long Q,N,M,K,T;
cin>>Q;
while(Q--)
{
cin>>N>>M>>K>>T;
for(int i=1; i<=M; i++)
scanf("%lld",&a[i]);
for(int i=1; i<=M; i++)
scanf("%lld",&b[i]);
long long sum=0;
for (int i=1; i<=N; i++)
{
for(int j=1; j<=K; j++) dp[j]=1e16;
for(int j=1; j<=K; j++)
for (int p=1; p<=M; p++)
dp[j]=min(dp[max(j-b[p],0LL)]+a[p],dp[j]);
for (int p=1; p<=M; p++)
b[p]=b[p]/T;
sum+=dp[K];
}
if (sum<1e16)
printf("%lld\n",sum );
else printf("No Answer\n");
}
}