演算法導論03 動態規劃 01揹包問題

2021-09-24 15:31:37 字數 1555 閱讀 8419

public class test ;

int weight = ;

sort(value,0,value.length - 1);

sort(weight,0,weight.length - 1);

system.out.println("value"+arrays.tostring(value));

system.out.println("weight"+arrays.tostring(weight));

int bag = 12;

knapsack(value, weight, bag);

}public static void sort(int in, int start, int end)

}public static void merge(int in, int left, int mid, int right) else

}while (p1 <= mid)

while (p2 <= right)

// 賦值到原陣列

for (int i = left; i <= right; i++)

}// 二維陣列法:缺點:資料大時,無法處理。

public static int knapsack(int value, int weight, int bag)

for (int j = 0; j < weight.length; j++)

// 如果第i個物品的重量小於揹包的容量,則會有兩種情況:

//(a)如果把第i個物品裝入揹包,則揹包物品的總價值等於第i-1個物品裝入容量為j-weight[i] 的揹包中的價值加上第i個物品的價值value[i];

//(b)如果第i個物品沒有裝入揹包,則揹包中物品總價值就等於把前i-1個物品裝入容量為j的揹包中所取得的價值。

//顯然,取二者中價值最大的作為 前i個物品裝入容量為j的揹包中的最優解。

for (int i = 1;i <= n; i++ ) else }}

int j = m;

// 逆序放入揹包

for (int i = n; i >= 1 ; i--)

}system.out.println("選中的物品是:");

for(int i=1; i<=n; i++)

system.out.println("總價值為"+f[n][m]);

return f;

}// 一維陣列法:解決了二維陣列法的問題

public static int knapsack4one(int value, int weight, int bag)

}return f[bag]; // 直接返回最優解

}/**

* 完全揹包問題(一維陣列解法):

* 1. 與0-1揹包問題的區別:0-1揹包是從weight陣列逆序遍歷,而完全揹包是順序遍歷的

*/public static int perfectknapsack4one(int value, int weight, int bag)

}return f[bag]; // 直接返回最優解

}}

演算法導論 01揹包問題 (動態規劃)

描述 有編號分別為n i 的五件物品,它們的重量分別是6,9,14,16,19,它們的價值分別是8,13,25,44,22,現在給你個承重為30的揹包,如何讓揹包裡裝入的物品具有最大的價值總和?遞迴求解 include include using namespace std const int we...

演算法導論16 2 2 動態規劃(0 1揹包問題)

小偷發現了n個商品,第i個商品重量為wi 價值為vi 小偷希望盡量拿走價值高的商品,但是他的揹包只能容納w重的商品。求如何取捨這些商品?由於對乙個商品,要麼被拿走要麼不被拿走,所以被稱為0 1揹包問題。我們如果採取列舉法進行比較,將會有2n 個情況,演算法複雜度與n呈指數關係。下面分析揹包問題的性質...

演算法之動態規劃 0 1揹包

經典的盜賊問題 乙個盜賊帶著乙個揹包去偷東西,房中有五件物品 1 6公斤 48元 2 5公斤 40元 3 2公斤 12元 4 1公斤 8元 5 1公斤 7元 但是他的揹包只能裝下8攻擊的東西 問他該怎樣選擇保障拿到的東西價值最大。思路 使用動態規劃來實現,1.將物品i 放到揹包裡面,修改選擇標誌 2...