analysis
方程
f
[
i
]
[
j
]
=
m
i
n
(
f
[
i
−
1
]
[
j
−
k
]
+
T
[
i
]
×
k
+
D
)
f[i][j]=min(f[i-1][j-k]+T[i]\times k+D)
f[i][j]=min(f[i−1][j−k]+T[i]×k+D)
0
<
=
k
<
=
m
i
n
(
j
,
Z
[
i
]
)
0<=k<=min(j,Z[i])
0<=k<=min(j,Z[i])
code
#include<bits/stdc++.h>
using namespace std;
#define max(a,b) ((a>b)?a:b)
#define min(a,b) ((a<b)?a:b)
#define loop(i,start,end) for(register int i=start;i<=end;++i)
#define anti_loop(i,start,end) for(register int i=start;i>=end;--i)
#define clean(arry,num) memset(arry,num,sizeof(arry))
int N,K,D,S;
const int maxn=110,maxk=110,maxd=110,maxs=110;
int T[maxk],Z[maxk];
int f[maxk][maxn];
template <typename T>void read(T &x)
{
x=0;T neg=1;char r=getchar();
while(r>'9'||r<'0'){if(r=='-')neg=-1;r=getchar();}
while(r>='0'&&r<='9'){x=(x<<3)+(x<<1)+r-'0';r=getchar();}
x*=neg;
}
int main()
{
freopen("datain.txt","r",stdin);
read(N),read(K),read(D),read(S);
clean(T,0);
clean(Z,0);
clean(f,10);
f[0][0]=0;
register int sum=0;
loop(i,1,K)read(T[i]),read(Z[i]),sum+=Z[i];
if(sum<N)
{
printf("impossible\n");
exit(0);
}
loop(i,1,K)
{
loop(j,0,N)
{
f[i][j]=f[i-1][j];
loop(k,0,min(Z[i],j))
{
f[i][j] = min(f[i][j],(f[i - 1][j - k] + k * T[i] + D));
}
}
}
printf("%d",f[K][N]);
return 0;
}