O(nt^2) 为啥能过
查看原帖
O(nt^2) 为啥能过
417018
dark_moon楼主2023/8/4 20:07

本来想写一个朴素的背包,然后再优化,没想到朴素的背包就直接过了,但是这个复杂度不太对吧

#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位变量的那一层循环,但是这个代码就直接过了,跑的也不慢

2023/8/4 20:07
加载中...