揹包最大容量10,有以下5個商品及其價值,試求揹包所能容納的最大價值。序號1
2345
重量226
54價值6
3546
**如下:
#include
#include
#define max_v 100
using
namespace std;
struct good
;/* 動態規劃求解
* n: 商品個數
* m: 揹包最大重量
* s: 乙個二維陣列, s[i][j]表示考慮前i個商品在揹包容量為j的情況下的最大價值。
* */
void
done
(good goods,
int n,
int m,
int s[max_v]
[max_v]
)else}}
}/*追蹤最優解*/
void
trace
(good goods,
int n,
int m,
int s[max_v]
[max_v]
) n --;}
}int
main()
,,,,
};int s[max_v]
[max_v]=;
done
(goods,5,
10, s)
; cout <<
"max:"
<< s[5]
[10]<< endl;
trace
(goods,5,
10, s)
;return0;
}
**如下:
#include
using
namespace std;
struct good
;/* n : 商品個數
* i : 回溯層次
* m : 最大容量
* v : 當前價值
* buf : 解的緩衝區
* solve : 問題最優解, 是乙個01向量
* maxp : 問題最優解的值
* */
void
done
(good goods,
int i,
int n,
int m,
int v,
int buf,
int solve,
int& maxp)
}return;}
//不裝
buf[i]=0
;done
(goods, i +
1, n, m, v, buf, solve, maxp)
;//裝
if(goods[i]
.w <= m)
}int
main()
,,,,
};int buf[5]
=;int solve[5]
=;int maxp =0;
done
(goods,0,
5,10,
0, buf, solve, maxp)
; cout <<
"solve: "
;for
(int i =
0; i <
5; i++
) cout << endl <<
"solve-value:"
<< maxp << endl;
return0;
}
**如下:
#include
#include
#include
#include
#include
#define max_v 256
using
namespace std;
struct node};
struct cmp};
/* 計算價值上界
* i : 當前搜尋層次
* m : 揹包剩餘容量
* */
intbound
(int ws,
int vs,
int i,
int n,
int m)
return v;
}/* 0-1揹包問題
* ws : 物品的重量
* vs : 物品的價值
* n : 物品的個數
* m : 揹包最大容量
* */
node*
bagging
(int ws,
int vs,
int n,
int m)
if(temp-
>v +
bound
(ws, vs, temp-
>l, n, m - temp-
>w)
> max_w)
else}}
}}//注意:這裡為了簡化,故沒有清除所有new出的物件。
}/*構造最優解*/
void
traceback
(node* node)
else
node = node-
>p;
}for
(int i = s.
size()
-1; i >=
0; i--
) cout << endl;
}int
main()
;//按照單位重量價值遞減排序
int vs=
;int n =
5, m =10;
node* solve =
bagging
(ws, vs, n, m)
; cout <<
"solve_value: "
<< solve-
>v << endl;
cout <<
"solve: "
;traceback
(solve)
;return0;
}
01揹包演算法
核心 狀態轉換方程 01揹包問題 容量為10的揹包,有5種物品,每種物品只有乙個,其重量分別為5,4,3,2,1,其價值分別為1,2,3,4,5。設計演算法,實現揹包內物品價值最大。如下 輸出14 include include using namespace std int main int v ...
01揹包演算法
01揹包問題 動態規劃的基本思想 動態規劃演算法可分解成從先到後的4個步驟 1.描述乙個最優解的結構,尋找子問題,對問題進行劃分。2.定義狀態。往往將和子問題相關的各個變數的一組取值定義為乙個狀態。某個狀態的值就是這個子問題的解 若有k個變數,一般用k維的陣列儲存各個狀態下的解,並可根 據這個陣列記...
演算法(揹包問題 01揹包問題)
01揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,...