揹包問題:從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...