1.题目描述:点击打开链接
2.解题思路:本题是完全背包问题的一种变形。根据题意描述,每种物品的价值随着A[i]是线性变化的,但是并不随着B[i]线性变化,B[i]仅仅是在第一次挑选第i件物品是才算入,其他时候均不算入。因此,这里的状态要比普通的完全背包增加一个维度:是否是第一次选第i件物品,即用(i,j,flag)表示当前背包容量为j时,是否为第一次选第i件物品时的最大价值。那么不难得到如下状态转移方程:
dp(i+1,j,0)=max{dp(i,j,0),dp(i,j,1)};
dp(i+1,j,1)=max{dp(i+1,j-w[i],0)+A[i]+B[i],dp(i+1,j-w[i],1)+A[i]}; (j≥w[i])
第一个方程表示不选第i件物品时,它的最大值来源于买前i件物品时候的最大值。第二个方程表示选第i件物品时,如果第i件物品时第一次被选择,那么等于dp(i+1,j-w[i],0)+A[i]+B[i],如果他已经被选过了,那么等于dp(i+1,j-w[i],1)+A[i]。取两个的较大者即可。
3.代码:
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
同样的,这个方程可以去掉i的维度,变成一个二维数组。
//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include