P2079 烛光晚餐

传送门https://www.luogu.com.cn/problem/P2079

容易知道,假如去掉 Σ X i ≥ 0 \Sigma X_i\geq0 ΣXi0的条件,这题就是个赤裸裸的0/1背包

分析数据范围:

容易知道复杂度一定是O(fV),其中f是一个代数式
与此同时,我们注意到 X i X_i Xi的绝对值不超过5,也就意味着 Σ X i \Sigma X_i ΣXi 的绝对值一定小于等于500
我们可以猜想:把Xi作为物品(即一道菜)的代价,最后统计答案时只统计满足 Σ X i ≥ 0 \Sigma X_i\geq0 ΣXi0的方案
由于中间过程允许出现 Σ X i < 0 \Sigma X_i<0 ΣXi<0的情况,开数组的时候应该开到两倍大小,保证不会出现负数下标。
大概框架:

for(register int i = 1; i <= n; ++i)
	for(register int j = v; j >= c[i]; --j) { //倒序循环
		//do something
	}

尤其要注意的是,为了保证 Σ X i \Sigma X_i ΣXi这个维度上枚举未被更新的数据(即f[i-1][j][k]),对于 X i < 0 X_i<0 Xi<0的情况,我们必须正序循环。否则就会访问到已经更新的数据(f[i][j][k])

if(x[i] > 0) 
	for(register int k = 1000; k >= x[i]; --k) {
	//?
		dp[j][k] = max(dp[j][k], dp[j - c[i]][k - x[i]]);
	}
else 
	for(register int k = 0; k <= 1000; ++k) {
	//?
		dp[j][k] = max(dp[j][k], dp[j - c[i]][k - x[i]];
	}

其中?处应该填入能够保证所有方案合法的代码,譬如

if(d[j - c[i]][k - x[i]] == -1)continue;

处理边界条件是DP的重要环节!
处理边界条件是DP的重要环节!
处理边界条件是DP的重要环节!

重要的事情说三遍!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值