概述
问题描述
假设有一个能装入总体积为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;
}
最后
以上就是生动皮带为你收集整理的【面试题】简单背包问题的全部内容,希望文章能够帮你解决【面试题】简单背包问题所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复