21.10.27模拟 solve


dsqwwe每个月都有m元的零花钱,他现在有n项消费计划,每个消费计划消耗2和
费用,一种是要花掉当前月的零花钱,另一种是要花掉下一个月的零花钱,每个月
的零花钱不能超支,若一个月的零花钱不能用完, dsqwwe会把钱花在其他地方,
也就是说,每个月剩余的零花钱不会留给下一个月。问 dsqwwe想要完成他所有的
消费计划最少需要几个月

n<=300,m<=1000
显然是DP,而且题目要求按顺序全部完成(被卡了好久)

我们设f[i][j]表示前i个月完成了前j项任务,第i个月还剩下最多的钱
然后枚举第i个月完成了任务k~j,前缀和优化即可

memset(f, 0xcf, sizeof f);
	f[0][0] = m;
	int ans(0);
	while(1) {
		++ans;
		rep(i, 1, n) {
			rep(j, 0, i) {
				if(f[ans - 1][j] >= a[i] - a[j] && m >= (b[i] - b[j])) {
					f[ans][i] = max(f[ans][i], m - (b[i] - b[j]));
				}
			}
		}
		if(f[ans][n] >= 0) {
			out(ans + 1, '\n');
			return 0;
		}
	}