C++ 动态规划求解多约束背包(0,1)
假设我有一个权重为w,值为v的对象集合。我想最大化所选对象的值之和,而不使它们的权重之和超过最大值W。直到现在,经典的背包问题 现在假设每一个物体都属于A类,B类,C类等等。。。现在,我希望我的解中的对象与A、B、C等的精确数目有关。我要求我的算法,否则返回最近的解 例如:C++ 动态规划求解多约束背包(0,1),c++,algorithm,C++,Algorithm,假设我有一个权重为w,值为v的对象集合。我想最大化所选对象的值之和,而不使它们的权重之和超过最大值W。直到现在,经典的背包问题 现在假设每一个物体都属于A类,B类,C类等等。。。现在,我希望我的解中的对象与A、B、C等的精确数目有关。我要求我的算法,否则返回最近的解 例如: Object 1 : w=4 v=16 Type A Object 2 : w=3 v=15 Type A Object 3 : w=2 v=5 Type A Object 4 : w=1 v=2 Type A Obje
Object 1 : w=4 v=16 Type A
Object 2 : w=3 v=15 Type A
Object 3 : w=2 v=5 Type A
Object 4 : w=1 v=2 Type A
Object 5 : w=1 v=4 Type B
Object 6 : w=2 v=4 Type B
Object 7 : w=2 v=3 Type B
Object 8 : w=4 v=9 Type B
Object 9 : w=3 v=9 Type B
Object 10: w=1 v=2 Type B
Object 11: w=1 v=4 Type B
Object 12: w=4 v=8 Type C
Object 13: w=8 v=19 Type C
Object 14: w=1 v=2 Type C
Object 15: w=3 v=5 Type C
Desired number of objects : A=2 B=5 C=2
Set of objects solution : A{1,2},B{5,6,7,9,11},C{13,15}
我的第一个方法是考虑多维数组,其中第一维是对象的数目,第二个最大W,和其他维度,每个类别所需的数字,并且在使用对象的权重为1的情况下用动态编程填充数组之后,如果对象属于类别,则如果没有,则使用1的权重。它不起作用,因为有时一些解决方案使用较少的对象会更好
我的第二种方法是在一个类别中找到所需数量的对象的每个可能子集,并将它们用作常规动态算法中的实例。这很管用,但似乎不雅观有什么想法吗?只要二维数组就行了 首先,应用一个名为
dp[n][m]
的数组,其中第一个维度是对象的数量,第二个维度是w
的总和。dp[i][j]
的值是第一个i
对象的v
的最大值,当前权重为j
我们可以得到方程:dp[i][j]=max(dp[i][j],dp[i-1][j-w]+v)
,其中w
是i-th
对象的权重,v
是i-th
对象的值
你的答案是
max(dp[n][j]|0你提出的是这个问题的经典解决方案。我已经很清楚这个问题,但它不起作用。在我的例子中,如果我们这样做,我们得到以下解:A{1,2}B{5,8,9,10,11}C{13}=78,正确的解是A{1,2},B{5,6,7,9,11},C{13,15}=76.请注意C类包含的对象不够多。很抱歉,我没有看到数量限制,我会尽快修改它。如果您的A、B、C似乎是等式约束,可能您需要查找迭代DP。