簡單揹包(無價值總和)問題的實現。

2021-04-21 21:46:07 字數 1824 閱讀 7193

揹包問題:從n個物件(每個物件的體積為wi, i=1, 2, …, n)中選取若干個恰好能夠填滿體積為t的揹包。

用棧實現,非遞迴解。要求解答出所有的方法!

//這是主函式

#include "stdafx.h"

#include "stack.h"

#define n 20

int w[n]=;

void main()

}if(stacklength(s)==length&&t>0||stackempty(s)==1&&ans==0)

if(stackempty(s)==1)

return;

if(t==0)

pop(s,i);

t+=w[i-1];

if(i==n)

i=n=n-1;

else

--i;

}printf("共有%d種方法/n",ans);

}//這是stack.h

#include "stdafx.h"

#include "stdio.h"

#include "malloc.h"

#include "stdlib.h"

#include "conio.h"

#define stack_init_size 100 //儲存空間初始分配量

#define stackincrement 10   //儲存空間分配增量

#define ok 1

#define error 0

#define ture 1

#define false 0

#define overflow -1

typedef int status;

typedef struct stack sqstack;

typedef int selemtype;

extern w[n];//外部變數

struct stack

;status initstack(sqstack &s)//棧的構造

s.top=s.base;

s.stacksize=stack_init_size;

return ok;

}status gettop(sqstack s,selemtype &e)//用e返回棧頂

status push(sqstack &s,selemtype e)//入棧

s.top=s.base+s.stacksize;

s.stacksize+=stackincrement;

}*s.top++=e;

return ok;

}status pop(sqstack &s,selemtype &e)//出棧

status stackempty(sqstack s)//判斷是否為空棧

if(s.base==s.top)

return ture;

else

return false;

}int stacklength(sqstack s)//棧的長度

return s.top-s.base;

}status clearstack(sqstack &s)//將棧置為空棧

s.top=s.base;

return ok;

}status destroystack(sqstack &s)//銷毀棧

s.base=null;

free(s.base);

return ok;

}status print(sqstack s)//針對揹包問題的列印函式

dowhile(p>=s.base);

return ok;

}

不考慮價值的揹包問題

揹包問題 假設有乙個能裝入總體積為t的揹包和n件體積分別為w1,w2,wn的物品,能否從n件物品中挑選若干件恰好裝滿揹包,使w i1 w i2 w in t,要求找出所有滿足上述條件的解。include include include using namespace std struct item ...

幾個簡單的揹包問題

0 1揹包問題,就是給n種石頭每塊石頭的價值為ai,問揹包容量為m的揹包最多裝價值多少?輸入樣例 3 82 5 5 3 4 5 輸出 8 因為不能重複選,所以這次 的的最大應該是dp i 1 include include include using namespace std int dp 500...

簡單的煩惱 揹包問題

第一行乙個整數t t 23 表示資料組數。在每組輸入資料中,第一行有兩個正整數,n n 200 t t 80000 分別表示歌單中歌曲的數目,和題目描述中的t。第二行中有n個正整數a i a i 400 表示每首歌曲的時間長度。對於每組資料,輸出乙個ans,表示最多能聽多長時間的歌曲。示例1 複製1...