#include <iostream>
using namespace std;
#define int long long
const int N = 300, M = 256000;
long long f[M], m, sum;
int s[N], c[N], n;
signed main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> s[i];
for (int i = 1; i <= n; i++)
cin >> c[i], sum += s[i] * c[i];
f[0] = 1;
for (int i = 1; i <= n; i++)
if (s[i] >= 2)
for (int j = sum; j >= 2 * c[i]; j--)
for (int k = 2; k <= s[i] && k * c[i] <= j; k++)
f[j] = max(f[j], f[j - k * c[i]] * k);
int i;
for (i = 1; f[i] < m; i++){}
cout << i << endl;
}
这是AC代码,跟我的0分代码只有一个区别,那就是我的代码里j是从小到大枚举的,零分。但是我把j调换顺序就满分了,这是为什么呢。我还特意去看了ACwing之前的多重背包打卡代码,那个代码是从小到大枚举的啊,这个题的多重背包有什么特殊的吗?(PS:有很多ACwing的打卡模板,拿来刷题的时候都有不兼容的时候,参照题解的代码/其他老师(比如董晓的二分板子跟yxc的就不一样)的代码模板会有不一样的地方,这是为什么呢?)