棧的練習 簡單的揹包問題

2021-08-17 17:52:26 字數 2644 閱讀 9860

-周碩 2023年3月28日

作業題3:假設有n件質量分配為w1,w2,…,wn的物品和乙個最多能裝載總質量為t的揹包,能否從這n件物品中選擇若干件物品裝入揹包,使得被選物品的總質量「恰好」等於揹包所能裝載的最大質量,即wi1+wi2+…+wik=t。若能,則揹包問題有解,輸出所有解;否則輸出無解。

思路:這道題用來熟悉棧的基本操作,其中包含了棧的操作——初始化(initstack)、置入元素(push)、彈出元素(pop)。從3月26號晚上一直到3月28號上午的程式設計課,我一直在修改找出問題,今天上午終於大功告成。揹包問題有更簡單的演算法,這裡只是用來熟悉c的語法和做棧的練習。

首先定義棧的函式——initstack、push、pop:(csdn貼c**沒有高亮真的難受..)

//揹包問題(棧)

#include#include#define ok 1

#define error -1

#define overflow -2

#define stack_init_size 100

#define stackincrement 10

//ok表示操作成功,error表示操作出錯,overflow表示申請空間或插入時溢位

//stack_init_size表示棧的初始空間,當棧的空間不夠用時每次再申請stackincrement的空間

typedef struct sqstack;

//定義棧結構。base為棧底指標,top為棧頂指標,stacksize為棧的空間。

這裡為了便捷,直接將base和top的指標型別設定成int型別,實際上還可以:

#define elemtype int 

typedef structsqstack;

函式宣告:

int initstack(sqstack *s);

int push(sqstack *s,int e);//壓入元素e

int pop(sqstack *s);

void package(sqstack *s,float maxweight,int n,float weight[stack_init_size])

//maxweight為最大質量,n為物品個數,陣列weight用於儲存各物品的重量

下面是棧的三個操作

int initstack(sqstack *s)  

int push(sqstack *s,int e)

*(s->top)=e;

s->top++;

return ok; }

int pop(sqstack *s)

這裡需要注意的是棧頂指標和棧底指標的關係。當棧中沒有元素時,s->top==s->base;當有元素被壓入棧底時,top++,top指向棧頂元素的上乙個空間。

在為棧申請空間或進行其他操作時,要盡可能考慮所有操作失敗的情況,用error或overflow進行返回。

main函式中進行輸入和儲存資料:

main()

//end for while

printf("\n");

pop(s);

currentweight-=weight[i];

if(i==n-1)

else

}else

}//end for if

else /*currentweighttop-1)!=n-1)//最後乙個元素沒有放入棧底

else//最後乙個元素放入棧底

//如果棧內沒有元素了,使i=n結束迴圈

else//否則再pop乙個元素

}}//end for else

}//end for else currentweight整個package子函式的思路大概是這樣:

這裡為了方便除錯,在每個分支中我都加入了乙個列印字元,比如//、@@、&&。摸索這個程式的方法是用一組一組資料來試驗,一遍一遍的走程式,直到讓所有的資料都能通過。

我試驗過的資料有:31

3421 253

2 1 365

2 1 3 4 6

讓這些資料都能成功這個程式就已經完成了~(撒花)

程式執行結果如下:

完成這個程式真的花了好長好長的時間,不過也學到了不少的東西。至少對揹包問題有了乙個非常全面的了解。還要繼續努力啊~

簡單揹包問題

設有乙個揹包可以放入的物品重量為s,現有n件物品,重量分別是w1,w2,w3,wn。問能否從這n件物品中選擇若干件放入揹包中,使得放入的重量之和正好為s。如果有滿足條件的選擇,則此揹包有解,否則此揹包問題無解。input 輸入資料有多行,包括放入的物品重量為s,物品的件數n,以及每件物品的重量 輸入...

簡單揹包問題

有乙個容量為v的揹包,從n件物品中選擇一些放入揹包中,每件物品的重量為w i 為v i 怎麼選擇合適的物品使得揹包內物品的總價值最大.這個問題中每個物品可供選擇的次數是0或1.即簡單揹包問題.若可選擇次數為n n為乙個有效的數字 則稱之為有界揹包問題.若可選擇次數無限,則稱之為無界揹包問題.所有的揹...

簡單揹包問題

設有乙個揹包可以放入的物品重量為s,現有n件物品,重量分別是w1,w2,w3,wn。問能否從這n件物品中選擇若干件放入揹包中,使得放入的重量之和正好為s。如果有滿足條件的選擇,則此揹包有解,否則此揹包問題無解。輸入輸入資料有多行,包括放入的物品重量為s,物品的件數n,以及每件物品的重量 輸入資料均為...