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...