我的二维条件是i代表第i辆车,j代表总共载走j个人,状态转移数组代表到第i辆为止载走j个人所花费的最少金钱。m[i][j]=min(m[i-1][j],m[i-1][j-1]+ti*1+D,m[i-1][j-2]+ti*2+D,...m[i-1][j-zi]+D)。
#include<stdio.h>
#include<string.h>//第一道完全自己分析的动态规划!!!!!!!,2013年4月1日
typedef struct Node{
int time,z;
}Node;
int mny[120][120];
Node tz[120];
int min(int a,int b){
if(a==-1) return b;
else if(b==-1) return a;
else return a<b?a:b;
}
main()
{
int i,j,T,N,K,D,S,max,ti_1,d,t,z,v,max2;
scanf("%d",&T);
while(T--){
scanf("%d %d %d %d",&N,&K,&D,&S);
memset(mny,-1,sizeof(mny));
for(i=0;i<K;i++) {
scanf("%d %d",&tz[i].time,&tz[i].z);
}
mny[0][0]=0;
max=tz[0].z;
for(i=1;i<=tz[0].z;i++){mny[0][i]=D+tz[0].time*i;}
for(i=1;i<K&&tz[i].time<=S;i++)
{
max2=max;
max+=tz[i].z;
mny[i][0]=0;
for(j=1;j<=max;j++)
{
for(d=tz[i].z;d>=0;d--)
{
if(j-d>=0&&j-d<=max2) mny[i][j]=min(mny[i][j],mny[i-1][j-d]+tz[i].time*d+D*(d>0?1:0));
}
}
}
d=i;
if(mny[K-1][N]!=-1)
printf("%d\n",mny[K-1][N]);
else printf("impossible\n");
}
}