本来想写一个朴素的背包,然后再优化,没想到朴素的背包就直接过了,但是这个复杂度不太对吧
#include<bits/stdc++.h>
#define int long long
using namespace std;
auto read = [](){
int x;
scanf("%lld", &x);
return x;
};
int n = read(), m = read(), t = read(), f[1005][1005], a[105], b[105];
signed main(){
for(int i = 1; i <= n; i ++)
a[i] = read(), b[i] = read();
memset(f, -1, sizeof(f));
f[0][m] = 0;
if(m >= t){
printf("0");
return 0;
}
for(int i = 0; i <= t; i ++){
for(int j = 0; j < t; j ++){
if(f[i][j] == -1)
continue;
for(int k = 1; k <= n; k ++){
for(int l = 1; j - l * a[k] >= 0; l ++)
f[i][j - a[k] * l] = max(f[i][j - a[k] * l], f[i][j] + b[k] * l);
}
}
for(int j = 0; j < t; j ++){
// printf("%lld ", f[i][j]);
if(f[i][j] == -1)
continue;
if(f[i][j] + j >= t){
printf("%lld", i + 1);
return 0;
}
f[i + 1][j + f[i][j]] = max(f[i + 1][j + f[i][j]], f[i][j]);
}
// printf("\n");
}
return 0;
}
本来想按A排序来优化那个n,然后用倍增优化以l位变量的那一层循环,但是这个代码就直接过了,跑的也不慢