rt
这是一份01背包模板
for(int i=0; i<n; ++i){
scanf("%d%d",&v,&w);
for(int j=V; j>=v; --j)
dp[j]=std::max(dp[j],dp[j-v]+w);
}
其中 dp[k,w] 应该表示前 k 个物品填满 w 的空间所获得的最大收益(第一维已滚掉,以下的 dp 数组都为滚掉后的),所以答案应该取 max(dp[1∼V])(V 为背包容量)。
但是,我直接使用了 dp[V] 作为答案,通过了众多背包板子题:
P1048
P1616
P1776 P1855
。
有的dalao说我能过是因为数据水,直接取 dp[V] 可能被卡,且lyd的蓝书也取了 max(dp[1∼V])。
所以,直接取 dp[V] 是正确的吗?如果是正确有没有证明?如果错误可不可以给出一个hack数据?