很简单的背包问题,由于状态转移过程漏了一个条件调了好久。。。
ACcode:
#include<cstdio>
#include<cstring>
int n,k,d,s;
int x[110],y[110],dp[110];
int Min(int a1,int a2)
{
return a1<a2?a1:a2;
}
int main()
{
int T,cas=0;
scanf("%d",&T);
while (T--)
{
scanf("%d%d%d%d",&n,&k,&d,&s);
for (int i=1; i<=k; i++)
scanf("%d%d",&x[i],&y[i]);
for (int i=1; i<=n; i++) dp[i]=-1;
dp[0]=0;
for (int i=1; i<=k; i++)
{
for (int j=n; j>=0; j--)
{
for (int r=y[i]; r>0; r--)
{
if (dp[j]!=-1)
{
if (dp[j+r]!=-1)
dp[j+r]=Min(dp[j+r],dp[j]+r*x[i]+d);
else dp[j+r]=dp[j]+r*x[i]+d;
}
// printf("dp[%d]=%d\n",j+r,dp[j+r]);
}
}
}
if (dp[n]!=-1) printf("%d\n",dp[n]);
else printf("impossible\n");
}
return 0;
}