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, '
');
return 0;
}
}