Algorithm 有条件的0/1背包和彩色物品

Algorithm 有条件的0/1背包和彩色物品,algorithm,dynamic-programming,knapsack-problem,Algorithm,Dynamic Programming,Knapsack Problem,我试图解决这个0/1背包问题: 我们有N种商品,每种商品的特点是重量、价格和颜色(白色、蓝色、红色或黑色) 我们必须选择12个具有最大值总价的项目,例如它们的重量之和您正在修改DP解决方案中的numW、numBlue等状态变量。尝试 在做了下面的更正之后,它似乎起了作用。尚未检查整体正确性,但回溯和DP解决方案给出了相同的答案 if (canAddItem(items[i], numW, numBlue, numR, numBlack, currSpent)) { if

我试图解决这个0/1背包问题:

我们有N种商品,每种商品的特点是重量、价格和颜色(白色、蓝色、红色或黑色)


我们必须选择12个具有最大值总价的项目,例如它们的重量之和您正在修改DP解决方案中的
numW、numBlue等状态变量。尝试
在做了下面的更正之后,它似乎起了作用。尚未检查整体正确性,但回溯和DP解决方案给出了相同的答案

    if (canAddItem(items[i], numW, numBlue, numR, numBlack, currSpent)) {
        if (items[i].color.equals("W")) numW++;
        if (items[i].color.equals("Blue")) numBlue++;
        if (items[i].color.equals("R")) numR++;
        if (items[i].color.equals("Black")) numBlack++;
        res = max(res, items[i].value + go( i + 1, numW, numBlue, numR, numBlack, (items[i].cost + currSpent)));
        if (items[i].color.equals("W")) numW--;
        if (items[i].color.equals("Blue")) numBlue--;
        if (items[i].color.equals("R")) numR--;
        if (items[i].color.equals("Black")) numBlack--;            
    }

注意,可能性的数量最多为C(N,12)。仍然很大,但是多项式,不是指数。如果没有完整的代码(MWE),我们很难直接编译和测试它来帮助您。@Damien C(100,12)=1050421051106700,我不认为这是一个选项,我添加了缺少的方法
    if (canAddItem(items[i], numW, numBlue, numR, numBlack, currSpent)) {
        if (items[i].color.equals("W")) numW++;
        if (items[i].color.equals("Blue")) numBlue++;
        if (items[i].color.equals("R")) numR++;
        if (items[i].color.equals("Black")) numBlack++;
        res = max(res, items[i].value + go( i + 1, numW, numBlue, numR, numBlack, (items[i].cost + currSpent)));
        if (items[i].color.equals("W")) numW--;
        if (items[i].color.equals("Blue")) numBlue--;
        if (items[i].color.equals("R")) numR--;
        if (items[i].color.equals("Black")) numBlack--;            
    }