题目:http://hihocoder.com/problemset/problem/1270
//还是要静下心来好好想想,想通了再写。。。 乱交一点意义都没有
//还是学长说的对:"提交简单,AC不易,且敲且叹息”。。。
//这题是个完全背包不过稍有变形 完全背包求得是给你一个背包V问装满V可以取得最大值,此时物品是无数个,此题是取得最小值。
//不过需要注意题目要求可以溢出 就是物品的容量即使大于V也可以存到V当中,所以需要稍加修改:
//if(v[j]>=k)dp[k]=min(dp[k],w[j]);
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll inf=(2<<31-2);
ll w[200];
ll v[200];
ll dp[10005];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m,K,x;
scanf("%d%d%d%d",&n,&m,&K,&x);
for(int i=1;i<=m;i++)
scanf("%lld",w+i);
for(int j=1;j<=m;j++)
scanf("%lld",v+j);
long long res=0;//需要64 防溢出
for(int i=0;i<n;i++)
{
for(int k=0;k<=K;k++)
dp[k]=inf;
dp[0]=0;
for(int j=1;j<=m;j++)
{
for(int k=0;k<=K;k++)
{
if(v[j])
{
if(v[j]>=k)
dp[k]=min(dp[k],w[j]); //修改i
else
dp[k]=min(dp[k],dp[k-v[j]]+w[j]);
}
}
}
for(int j=1;j<=m;j++)
v[j]/=x;
res+=dp[K];
}
if(res>=inf)
puts("No Answer");
else
printf("%lld\n",res);
}
return 0;
}