揹包問題用逆序減少空間複雜度的情況下,
//揹包問題,如果是多維揹包(質量,容積,個數),則加矩陣維度;如果是01揹包,則逆序內迴圈,如果是完全揹包(每種物品個數不限),則順序內迴圈,如果是混合揹包(限制每種物品的個數)。
#include
using namespace std;
#define maxn 110
#define maxk 110
//給定整數集合, 元素個數為n,給定整數k,存在a的乙個子集其和恰好為k嗎?o(nk) ,如1,3,5,6,則9恰好等於1+3+5或6+3
bool kp_justk(int a, int n, int k)
///---------just_k--------
//----01揹包問題,給定n個物品重量w1,w2,....,wn, 價值p1,p2,....,pn,揹包負重大小w, 求最大的價值,並表示出此時裝入的物品
//動態規劃o(nw)
#define maxval 110
void print_kp01(int (*rec)[maxval], int w, int p, int i, int j)
else
print_kp01(rec,w,p,i-1,j);
} int kp_01(int w, int p, int n, int bigw) //o(nw)空間
else
print_kp01(rec,w,p,n,bigw);
return val[n][bigw];
} int kp_01_(int w, int p, int n, int bigw) //o(w)空間 (如果想輸出具體的一組特例還是需要兩層迴圈)
//----01揹包問題--------
//--------------完全揹包---------每種物品的個數無限制---- (如果想輸出具體的一組特例還是需要三層迴圈)
int kp_complete(int w, int p, int n, int bigw) //o(w)空間
//--------------完全揹包------------
//--------------混合揹包問題-------------每種物品的個數只能取n個
//轉化為01揹包問題
//--------------混合揹包問題-------------
//---------------二維費用揹包---加乙個維度即可----如總物品最多能取m件(或揹包體積是多大),假設是在01揹包的基礎上
int kp_doublecost(int w, int p, int n, int bigw, int m) //o(w)空間
//---------------二維費用揹包-------
int main()
,b=,k,bigw;
//cout<<"k: ";
//cin>>k;
//cout//if(!kp_justk(a,5,i))
//cout<
cout<<"bigw: ";
cin>>bigw;
coutgoto loop;
return 0;
}
演算法(揹包問題 01揹包問題)
01揹包問題 有 n 件物品和乙個容量是 v 的揹包。每件物品只能使用一次。第 i 件物品的體積是 vi,價值是 wi。求解將哪些物品裝入揹包,可使這些物品的總體積不超過揹包容量,且總價值最大。輸出最大價值。輸入格式 第一行兩個整數,n,v,用空格隔開,分別表示物品數量和揹包容積。接下來有 n 行,...
演算法 揹包問題
什麼是揹包問題呢?就是乙個特定載重的揹包,給你乙個資料表,求解其最優的結果,那麼很顯然嘍 這就是乙個優化問題 那麼我們具體一點!這個揹包載重8千克 李子 4kg 4500元 蘋果 5kg 5700元 士多啤梨 1kg 1100元 橘子 2kg 2250元 甜瓜 6kg 6700元 那,我們使用動態規...
變種 揹包問題 演算法設計 揹包問題
題目 乙個旅行者準備隨身攜帶乙個揹包,可以放入揹包的物品有n種,每種物品的重量和價值分別為wj,vj 如果揹包的最大重量限制是b,怎樣選擇放入揹包的物品以使得揹包的價值最大?目標函式 約束條件 演算法設計 設fk y 表示只允許裝前k 種物品,揹包總重不超過y 時揹包的最大價值。fk y 有兩種情況...