为一个“BEHAPPY”制作背包式解决方案?

时间:2016-01-25 12:57:40

标签: algorithm logic dynamic-programming

问题在problem描述,我一直试图达到上述问题的迭代dp解决方案。 我从编码经验中可以猜到,它应该有三个维度,每个状态由以下唯一标识: -

M = Gifts not distributed yet.
N = first N girlfriends available (Similar to 0-1 Knapsack)
C = Maximum gifts allowable for current girlfriend.  

现在初始化为 M = 0 ,N,C(即剩下0件礼物待分发)

      1 2 3 4 (girlfriends)
    0
    1
    2
    3
   (Capacity)

我似乎有一个问题,初始化为k = 0,因为对于女朋友来说存在一个低和高的礼物限制,因此偏离标准背包只有最大限制(不考虑背包找到最佳解决方案,在这里我考虑所有可能的解决方案)

当然,我可能完全在错误的路径上,如果您认为是这种情况,这个3状态变量dp的重复和初始化是什么?

提前致谢

1 个答案:

答案 0 :(得分:1)

首先删除所有最低要求。 M -= sum(A[i])B[i] -= A[i]。这些是最小的,因此我们无需四处移动,只需分配它们并将它们从计算中取出。

现在你的解决方案矩阵sol[g, m]是你可以在剩下礼物的同时解决第一批女朋友的方式。 sol[g,m] = sum(sol[g-1, m-j], j= [0..B[g-1]]。用1初始化sol [0,M],其余为0。 你的解决方案是sol [N + 1,0]。

如果你反复进行,你只需要最后一行。