背包问题(栈解法)
2011-03-04 15:11
351 查看
/*
有N件物品,每件物品都有相应的重量,现在有一个背包,
背包只能装count公斤的物品,问背包装满count公斤,有多
少中装法?物品不得重复。
*/
#include <iostream>
using namespace std;
#define N 8 //N为 多少件物品
int array[8] = {1,2,3,4,5,6,7,8}; //每个物品的重量
int count = 10; //要求装10公斤的物品
typedef struct stack
{
int top;
int max;
int * ptr;
}stack;
void init(stack & mystack)
{
mystack.top = -1;
mystack.max = 10;
mystack.ptr = new int[mystack.max];
}
void push(stack & mystack,int value)
{
if (mystack.top < mystack.max)
{
mystack.top++;
mystack.ptr[mystack.top] = value;
}
}
int pop(stack & mystack)
{
int value = 0;
if ( mystack.top == -1)
return value;
else
{
value = mystack.ptr[mystack.top];
mystack.top--;
}
return value;
}
int isempty(stack & mystack)
{
if (mystack.top == -1)
return -1;
else
return 0;
}
void traver(stack & mystack)
{
int i = 0;
while ( i<=mystack.top )
{
cout<<array[mystack.ptr[i]]<<" ";
i++;
}
cout<<endl;
}
int main(int argc, char* argv[])
{
int i=0;
stack mystack;
init(mystack);
/*当栈非空,或者栈空,但未遍历完array时*/
while ( !isempty(mystack) || isempty(mystack)&&i<N )
{
while (count > 0 && i<N) //当余下的重量还大于0时,且还未遍历完array时
{
count-=array[i]; //余下的重量减去将入栈的物品重量
push(mystack,i); //入栈
i++; //array往后遍历
}
if (count == 0) //如果达到要求,则输出
{
traver(mystack);
}
i = pop(mystack); //此时必然要出栈一个
count+=array[i]; //余下的重量加出栈的物品重量
i++; //array往后遍历
}
return 0;
}
有N件物品,每件物品都有相应的重量,现在有一个背包,
背包只能装count公斤的物品,问背包装满count公斤,有多
少中装法?物品不得重复。
*/
#include <iostream>
using namespace std;
#define N 8 //N为 多少件物品
int array[8] = {1,2,3,4,5,6,7,8}; //每个物品的重量
int count = 10; //要求装10公斤的物品
typedef struct stack
{
int top;
int max;
int * ptr;
}stack;
void init(stack & mystack)
{
mystack.top = -1;
mystack.max = 10;
mystack.ptr = new int[mystack.max];
}
void push(stack & mystack,int value)
{
if (mystack.top < mystack.max)
{
mystack.top++;
mystack.ptr[mystack.top] = value;
}
}
int pop(stack & mystack)
{
int value = 0;
if ( mystack.top == -1)
return value;
else
{
value = mystack.ptr[mystack.top];
mystack.top--;
}
return value;
}
int isempty(stack & mystack)
{
if (mystack.top == -1)
return -1;
else
return 0;
}
void traver(stack & mystack)
{
int i = 0;
while ( i<=mystack.top )
{
cout<<array[mystack.ptr[i]]<<" ";
i++;
}
cout<<endl;
}
int main(int argc, char* argv[])
{
int i=0;
stack mystack;
init(mystack);
/*当栈非空,或者栈空,但未遍历完array时*/
while ( !isempty(mystack) || isempty(mystack)&&i<N )
{
while (count > 0 && i<N) //当余下的重量还大于0时,且还未遍历完array时
{
count-=array[i]; //余下的重量减去将入栈的物品重量
push(mystack,i); //入栈
i++; //array往后遍历
}
if (count == 0) //如果达到要求,则输出
{
traver(mystack);
}
i = pop(mystack); //此时必然要出栈一个
count+=array[i]; //余下的重量加出栈的物品重量
i++; //array往后遍历
}
return 0;
}
相关文章推荐
- 0-1背包问题(一维数组解法)
- 背包问题(非递归解法)
- 多背包问题近似解法及其近似比
- 01背包问题,dp和贪心解法(c++11)
- Exercise(4):01背包(简单动规)问题的两种解法
- 0-1背包问题 —— 四种解法解题
- 分组背包问题解法
- 01 背包问题的另类解法
- 背包问题基本解法 —— 《背包九讲》笔记
- 0-1背包问题动态规划解法
- 背包分组问题的解法
- 0-1背包问题的动态规划解法
- 多重背包问题(悲剧解法)
- 背包问题的递归和非递归的解法
- java--0-1背包问题--动态规划解法
- 转:背包问题的解法
- 多重背包问题解法简单分析(POJ 1276为例)
- 01背包问题 动态规划解法
- 背包问题-四种解法(穷举,递归,二维数组,一维数组)
- p1054 简单背包问题的递归解法