-周碩 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,以及每件物品的重量 輸入資料均為...