DP-01背包

梦想游戏人
目录:
algorithm

套路:最大值 , 最优,最大,最小,最长,计数

01背包是在M件物品取出若干件放在空间为W的背包里,每件物品的体积为W1,W2……Wn,与之相对应的价值为P1,P2……Pn。求最大价值

先暴力递归式求解

int w[10] = { 1, 4, 3, 0, 0, 0, 0, 0, 0 };
int v[10] = { 4, 6, 3, 0, 0, 0, 0, 0, 0 };


//0 5
int f(int x, int W)
{
	if (W < w[x])return f(x + 1, W);//剩余可用重量 小于当前物体重量

	if (W <= 0)return 0;//剩余重量 返回价值0
	if (x >= 4)return 0;

	int ret = max(f(x + 1, W - w[x]) + v[x], f(x + 1, W));// 拿和不拿

	return ret;
}

然后利用数组来存储已经计算过了的值,,递归到需要返回的时候

因为递归式的重量是依次递减,然后递推至最大

物品index 是在最大依次减小 所以DP循环的顺序就可以这样写

	for (int xx = num - 1; xx >= 0; xx--)
	{
		for (int ww = 0; ww <= MAX; ww++)
		{
			if (ww < w[xx])
			{
				arr[xx][ww] = arr[xx + 1][ww];
			}
			else
			{
				int a = arr[xx + 1][ww - w[xx]] + v[xx];//拿
				int b = arr[xx + 1][ww];// 不拿
				arr[xx][ww] = max(a, b);
			}
		}
	}
Scroll Up