#include <iostream>
#include <cstring>
using namespace std;
const int N = 105;
int n, m, v, w, d, s, z, f[N];
int main()
{
cin >> m >> n >> d >> s;
memset(f, 0x3f, sizeof(f));
f[0] = 0;
while (n--)
{
cin >> w >> z;
for (int j = m; j >= 1; j--)
for (int v = 1; v <= z; v++)
if (j >= v)
f[j] = min(f[j], f[j - v] + v * w + d);
}
if (f[m] != 0x3f3f3f3f)
cout << f[m] << endl;
else
puts("impossible");
}
我把v放在外面那一层就不行,这是为什么呢?我相当于把一个多重背包拆解成容量分别为1~z的z个背包进行选取,为什么就0分呢,循环放到里面就AC了