【面试题】简单背包问题

问题描述

假设有一个能装入总体积为T的背包和N件体积分别任w1、w2、w3、……wn的物品,能否从n件物品中挑选若干件恰好装满背包,即w1+w2+……Wn = T,要求满足上述条件的解。

例如,当T = 10,各件物品的体积为{1、8、4、3、5、2}时,可以
找到下列4组解:
(1,4,3,2)、(1,4,5)、(8,2)、(3,5,2)

分析问题

可以借助栈来存储,各种物品来计算物品的值。栈中存储的是物品的下标,这样方便当前物品不满足时,得到下一种物品。
i为物品的下标,控制栈中物品是否遍历。
res中保存的各种解,

下面的方法类似于暴力枚举法,

// 把背包的索引放在栈中

int main()
{
    int wight = 10; //背包总重量
    int goods[] = {1,8,4,3,5,2};
    stack<int> goodstack; //存放物品下标
    vector<stack<int> > res;
    int Count = 0; //计已查物品的总重
    int i = 0; //数组下标

    goodstack.push(i);
    Count += goods[i];
    i++;
    if (Count == wight)
    {
        res.push_back(goodstack);
        Count -= goods[i-1];
        goodstack.pop();
        goodstack.push(i++);
    }
    while (true)
    {
        while (!goodstack.empty() && i < 6)
        {
            goodstack.push(i);
            Count += goods[i];
            if (Count == wight)
            {
                res.push_back(goodstack);
                goodstack.pop();
                Count -= goods[i];
                i++;
            }
            else if (Count > wight) //大的话弹出
            {
                Count -= goods[i];              
                goodstack.pop();
                i++;
            }
            else
            {
                i++;
            }

        }   

        if (i == 6 && !goodstack.empty())
        {
            i = goodstack.top() + 1;
            goodstack.pop();
            Count -= goods[i - 1];
        }
        //以i开始的完了
        if (goodstack.empty() && i < 6)
        {
            goodstack.push(i);
            Count += goods[i];
            i++;
            if (Count == wight)
            {
                res.push_back(goodstack);
                Count -= goods[i - 1];
                goodstack.pop();
                goodstack.push(i++);
            }
        }
        else if (goodstack.empty() && i == 6)
            break;

    }
    system("pause");
    return 0;
}   

猜你喜欢

转载自blog.csdn.net/wenqiang1208/article/details/77198510