日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

书包问题

發布時間:2023/12/20 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 书包问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
#include <iostream> using namespace std;// abstract data type for stacktemplate <class T> // 棧的元素類型為 T class Stack { public: // 棧的運算集void clear(); // 變為空棧bool push(const T item); // item入棧,成功則返回真,否則返回假bool pop(T* item); // 返回棧頂內容并彈出,成功返回真,否則返回假,bool getTop(T* item); // 返回棧頂內容但不彈出成功返回真,否則返回假,bool isEmpty(); // 若棧已空返回真bool isFull(); // 若棧已滿返回真 };// array-based stack: definition and implementation for some methodstemplate <class T> class arrStack: public Stack<T> { private: // 棧的順序存儲int mSize; // 棧中最多可存放的元素個數T *st; // 存放棧元素的數組 public: int top; // 棧頂位置,應小于mSize public: // 棧的運算的順序實現arrStack(int size) { // 創建一個順序棧的實例mSize = size;top = -1;st = new T[mSize];}~arrStack() { // 析構函數delete [] st;}void clear() { // 清空棧內容top = -1;}bool push(const T item) { // 入棧操作的順序實現 if (top == mSize-1) { // 棧已滿 cout << "棧滿溢出" << endl;return false;}else { // 新元素入棧并修改棧頂指針st[++top] = item;return true;}}bool pop(T* item) { // 出棧的順序實現if (top == -1) { // 棧為空cout << "棧為空,不能出棧操作"<< endl; return false;}else {*item = st[top--]; // 返回棧頂元素并修改棧頂指針return true;}}bool getTop(T* item) { // 返回棧頂內容,但不彈出if (top == -1) { // ??誧out << " 棧為空,不能出棧操作"<< endl; return false;}else { *item = st[top];return true;}}bool isEmpty() { return (top == -1);}bool isFull() { return (top == mSize-1);} };bool knap(int s, int n); bool nonRecKnap(int s, int n); bool nonRecKnapOpt(int s, int n);enum rdType {a, b, c}; class knapNode {friend bool nonRecKnap(int s, int n);friend bool nonRecKnapOpt(int s, int n);int s, n; // 背包的承重量和物品的數目rdType rd; // 返回地址bool k; // 結果單元 }; // 引入兩個與棧中結點類型相同的變量tmp和x作為進出棧的緩沖: class knapNode tmp, x;// 定義一個棧變量: //Stack<knapNode> st(20); int w[5] = {2,4,4,5,7};int main() {int s;cin >> s; cout << "recursion" << endl; if (knap(s, 5)) cout << "Have solution" << endl;else cout << "No solution" << endl;cout << "non recursion" << endl; if (nonRecKnap(s, 5)) cout << "Have solution" << endl;else cout << "No solution" << endl;cout << "non recursion optimization" << endl; if (nonRecKnapOpt(s, 5)) cout << "Have solution" << endl;else cout << "No solution" << endl;cin >> s; return 0; } //遞歸版的背包問題 bool knap(int s, int n) {if (s == 0) return true;if ((s < 0)||(s>0 && n <1))return false;if (knap(s-w[n-1], n-1)) {cout << w[n-1];return true;} else knap(s, n-1); } // 非遞歸的機械版 bool nonRecKnap(int s, int n) {arrStack<knapNode> st(20); tmp.s = s, tmp.n = n, tmp.rd = a; // 非遞歸調用入口st.push(tmp);label0: // 遞歸調用入口st.pop(&tmp); if (tmp.s == 0 ) { tmp.k = true; // 修改棧頂的結果單元kst.push(tmp);goto label3;}if ((tmp.s < 0) || (tmp.s > 0 && tmp.n < 1)) {tmp.k = false; // 修改棧頂的結果單元kst.push(tmp);goto label3;}st.push(tmp);x.s = tmp.s-w[tmp.n-1]; // 按照規則1進行壓棧處理x.n = tmp.n -1;x.rd = b;st.push(x);goto label0;label1: // 規則1對應的返回處理st.pop(&x); // 查看棧頂,根據其內容分情況處理if (tmp.k == true) { // 若某層的結果單元為truex.k = true; // 把true結果上傳給調用方st.push(x);cout << w[x.n-1]<<endl; // 并輸出對應的物品goto label3;}st.push(x); // 若某層的結果單元為falsetmp.s = x.s; // 當前物品的選擇不合適,回溯,調用規則2tmp.n = x.n - 1; // 按照規則2進行壓棧處理tmp.rd = c;st.push(tmp);goto label0;label2: // 規則2對應的返回處理st.pop(&x);x.k = tmp.k; // 結果單元k的內容上傳給調用方st.push(x);label3: // 遞歸出口處理st.pop(&tmp);switch (tmp.rd) {case a: return tmp.k; // 算法結束并返回結果case b: goto label1; // 轉向規則1的返回處理處case c: goto label2; // 轉向規則2的返回處理處} } // 非遞歸的優化版 bool nonRecKnapOpt(int s, int n) {int t, n0 = n;bool k = false;arrStack<knapNode> st(20); tmp.s = s, tmp.rd = a; st.push(tmp);while (!st.isEmpty()) {t = st.top;st.getTop(&tmp);while ((tmp.s >= 0) && (tmp.s <= 0 || n0 > t)){ //處理棧頂元素,以判斷是否滿足遞歸出口條件if (tmp.s == 0 ) { k = true;break;} else { // 尚未遞達歸出口前,按規則1進行壓棧操作x.s = tmp.s - w[n0 - 1 - t];x.rd = b;st.push(x);}t = st.top;st.getTop(&tmp);}while (!st.isEmpty()) { // 返回處理 st.pop(&tmp);t = st.top;if (tmp.rd == 0) // 算法結束return k; if (tmp.rd == 1) // 從規則1返回if (k == true) // 結果為真則打印對應的物品cout << w[n0 - 1 - t]<<endl; else { // 否則回溯,采用規則2進棧st.getTop(&x);tmp.s = x.s;tmp.rd = c;st.push(tmp);break;}}} }

總結

以上是生活随笔為你收集整理的书包问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。