問題描述
假設有乙個能裝入總體積為
t的揹包和
n件體積分別為w1
,w2,…
wn的物品,能否從
n件物品中挑選若干件恰好裝滿揹包,即使w1
+w2+…
+wm=t
,要求找出所有滿足上述條件的解。
例如:當t=10
,各件物品的體積
時,可找到下列
4組解:
(1,4,3,2)
(1,4,5)
(8,2)
(3,5,2)。
實現提示
可利用回溯法的設計思想來解決揹包問題。首先,將物品排成一列,然後,順序選取物品裝入揹包,若已選取第
i件物品後未滿,則繼續選取第
i+1件,若該件物品「太大
」不能裝入,則棄之,繼續選取下一件,直至揹包裝滿為止。
如果在剩餘的物品中找不到合適的物品以填滿揹包,則說明「剛剛」
裝入的物品
「不合適
」,應將它取出
「棄之一邊
」,繼續再從
「它之後
」的物品中選取,如此重複,直到求得滿足條件的解,或者無解。
由於回溯求解的規則是「
後進先出
」,自然要用到「棧
」。進一步考慮:
如果每件物品都有體積和價值,揹包又有大小限制,求解揹包中存放物品總價值最大的問題解
---最優解或近似最優解。
stackbag.h
#ifndef _stackbag_h
#define _stackbag_h
#include#includeclass stone;
void setparams(int vo,int va);
};class mystack;
stone items[max];
int numofsolution;
int t;
int top;
public:
mystack(int t):top(0);
bool isempty() const;
bool isfull() const;
bool pop(stone&);
bool push(stone);
void solution(stone* a,int n);
int sum();
void clearstack() ;
void print();
void bestsolution();
};int mystack::sum()
bool mystack::pop(stone& it)
std::cout<<"stack is full\n";
return false;
}bool mystack::push(stone it)
return false;
}void mystack::print()
void mystack::solution(stone* b,int n)
#endif // _stackbag_h
main.cpp
#include#include"stackbag.h"
int main()
mystack sta=mystack(bagsize);
sta.solution(stones,stonenumber);
sta.bestsolution();
delete stones;
return 0;
}
九大揹包問題專題 完全揹包問題(詳解,最優解)
和01揹包問題的區別 01揹包問題 1件物品只能選或者不選 完全揹包問題 1件物品可以重複選多次,只要不超過總體積 題目 問題 有n件物品和乙個容量是v的揹包。第i件物品的體積是vi,價值是wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包的容量,且價值最大。輸入格式 第一行有兩個整數,n...
用棧解決迷宮問題求出路徑
1.用棧解決迷宮問題,比較暴力,實際上是經過大量的試錯才得出的路徑 問題分析 a.首先畫出圖,我用1代表牆,用0代表非牆。b.首先要規定入口的座標位置 c.然後規定尋找的方向規則比如 先每到乙個位置先看下該點的左側是否非牆,如果是返回該點的座標並將該點對應的下標 在之後要用該下標解析出對應的座標 入...
用貪心演算法解決揹包問題
貪心演算法 顧名思義,貪心演算法 總是能做到當前看來是最好的選擇。也就是說貪心演算法並不從整體最優上加以考慮,它所作出的選擇只是在某種意義上的 區域性最優選擇 所謂貪心選擇性質是指所求問題的整體最優解可以通過一系列區域性最優的選擇,是貪心演算法與動態規劃演算法的主要區別。0 1揹包問題 給定n種物品...