整個流程:
初始乙個狀態
通過設計的轉移方式進行轉移,並求出所有轉移方式對應的增量和新狀態
依次從最好的狀態進行判斷是否滿足解除禁忌(也就是能不能選為新狀態)
可以選為新狀態的條件:(1).價值大於歷史最優值。(2).禁忌表中沒有
如果不滿足上述兩條,選擇次優狀態再進行判斷。
重複上述過程
注:有的禁忌表存的禁忌狀態是操作,我這裡存的就是歷史選擇狀態。
禁忌表長度影響收斂,太小的話收斂不到最好值。
#include
using
namespace std;
#define maxn 105
#define maxm 1006
#define ll long long int
#define inf 0x3f3f3f3f
#define inc(i,l,r) for(int i=l;i<=r;i++)
#define dec(i,r,l) for(int i=r;i>=l;i--)
#define mem(a) memset(a,0,sizeof(a))
#define sqr(x) (x*x)
#define inf (ll)2e18+1
#define pi acos(-1)
#define mod 10007
#define db double
#define auto(i,x) for(int i=head[x];i;i=ed[i].nxt)
///實現上使用狀壓n個物品的選擇狀態 所以 n 不能太大
///不然對時間空間複雜度要求太高
///禁忌表長度太短不容易收斂
ll read()
while
(isdigit
(ch)
)x=x*
10+ch-
'0',ch=
getchar()
;return f*x;
}int n,m,w;
db xiaorand
(db low,db up,db jin)
struct nodea[maxn]
;queueq;
int jj_len=15;
unordered_mapint>mp;
intf
(ll x)
return sumw <= w ? sumv :
-inf;
}struct state};
priority_queuebiao;
void
solve
(int step));
}while
(!biao.
empty()
) q.
push
(nowsta)
;mp[nowsta]=1
; sta=nowsta;
c_max=
max(c_max,cur_ma)
;break;}
else
if(c_maxq.
push
(nowsta)
;mp[nowsta]=1
; sta=nowsta;
break;}
else
continue;}
}}intmain()
演算法(揹包問題 01揹包問題)
01揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,...
揹包問題之01揹包問題
題目 有n件物品和乙個容量為v的揹包。第i件物品的容量是c i 價值為w i 求解將哪些物品裝入揹包可以使得這些物品的費用總和不超過揹包容量,且價值總和最大。基本思路 作為最基礎的揹包問題,特點是 每種物品只有一件,可以選擇放或者是不放。用子問題定義狀態 f i v 表示前i件物品恰好放入乙個容量為...
揹包問題之01揹包
01揹包就是說針對每一件物品,有選擇裝入或者放棄,是屬於動態規劃類的問題。現在假設我們有m件物品,各有價值,揹包承重為10,假設當前可用的承重量為v,當前在抉擇第m件物品是否放入,重量為w1,價值為v1,那麼,如果不放入,我們的價值應該保持不變,並與之前算出的最大價值相同,如果放入,放入後的價值就是...