每日演算法第103期:演算法實驗5(三種方法解決01揹包問題:動態規劃,回溯,分支限界)
實驗內容
- 使用貪心演算法、回溯法、分支限界法解決0-1揹包問題;
- 通過上機實驗進行演算法實現;
- 儲存和列印出程式的執行結果,並結合程式進行分析,上交實驗報告。
動態:
package org.csu.shiyan_5;
import sun.dc.pr.PRError;
public class Dinggui0_1BAG{
public static void main(String[] args) {
int MaxWeight = 10;
int NumofItems = 5;
int []weight = new int[]{2,2,6,5,4};
int[] value = new int []{6,3,5,4,6};
System.out.println("最後的結果為");
System.out.println(solution(MaxWeight,NumofItems,weight,value));
System.out.println("表格為");
for(int j = 1;j<=NumofItems;j++){
for(int i = 1;i<=MaxWeight;i++){
System.out.print(solution(i,j,weight,value));
System.out.print("\t");
}
System.out.println();
}
}
public static int solution(int N,int W,int []weight,int []value){
int [][]map = new int[N+1][W+1];
for(int i = 1;i<=W;i++){
int values = value[i-1];
int weights = weight[i-1];
for(int j = 0;j<=N;j++){
if(j<weights){
map[j][i] = map[j][i-1];
continue;
}
map[j][i] = Math.max(map[j][i-1],map[j-weights][i-1]+values);
}
}
return map[N][W];
}
}
回溯:
package org.csu.shiyan_5;
import java.util.Scanner;
class back{
public int value = 0;
public int weight = 0;
back(){}
}
public class Feizhixianjie0_2BAG {
static int cw,cp,bestp,n,c;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("請輸入物品的個數:");
n = input.nextInt();
System.out.println("請輸入揹包的容量:");
c = input.nextInt();
back []b = new back[1000];
System.out.println("請輸入每個物品的價值和重量:");
for(int i=1;i<=n;i++) {
b[i] = new back();
b[i].value = input.nextInt();
b[i].weight = input.nextInt();
}
Backtrack(1,b);
System.out.println("最優解為:");
System.out.println(bestp);
}
public static float bound(int t,back []b)
{
float a=cp;
int i;
for(i=t;i<=n;i++)
a+=b[i].value;
return a;
}
public static void Backtrack(int t,back[]b)
{
if(t>n)
{
if(cp>bestp)
bestp=cp;
return;
}
if(cw+b[t].weight<c)
{
cw+=b[t].weight;
cp+=b[t].value;
Backtrack(t+1,b);
cw-=b[t].weight;
cp-=b[t].value;
}
if(bound(t+1,b)>bestp)
Backtrack(t+1,b);
}
}
分支限界法:
package org.csu.shiyan_5;
import java.util.Scanner;
class back1{
public int value = 0;
public int weight = 0;
back1(){}
}
public class Huisufa0_1PBAG{
static int cw,cp,bestp,n,c;
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
System.out.println("請輸入物品的個數:");
n = input.nextInt();
System.out.println("請輸入揹包的容量:");
c = input.nextInt();
back1 []b1 = new back1[1000];
System.out.println("請輸入每個物品的價值和重量:");
for(int i=1;i<=n;i++) {
b1[i] = new back1();
b1[i].value = input.nextInt();
b1[i].weight = input.nextInt();
}
for(int i = 1;i < n;i++ ) {
if (cmp(b1[i], b1[i + 1])) {
int t = b1[i].weight;
b1[i].weight = b1[i + 1].weight;
b1[i + 1].weight = t;
t = b1[i].value;
b1[i].value = b1[i + 1].value;
b1[i + 1].value = t;
}
}
Backtrack(1,b1);
System.out.println("最優解為:");
System.out.println(bestp);
}
public static boolean cmp(back1 b1,back1 b2)
{
if(b1.value*1.0/b1.weight>b2.value*1.0/b2.weight)
return true;
return false;
}
public static float bound(int t,back1 []b)
{
float a=cp;
int left=c-cw;
while(t<=n)
{
if(left > b[t].weight) {
a += b[t].value;
left -= b[t].weight;
t++;
}
}
if(t<=n)
{
a+=b[t].value*left*1.0/b[t].weight;
}
return a;
}
public static void Backtrack(int t,back1[]b) {
if (t > n) {
if (cp > bestp)
bestp = cp;
return;
}
if (cw + b[t].weight < c) {
cw += b[t].weight;
cp += b[t].value;
Backtrack(t + 1,b);
cw -= b[t].weight;
cp -= b[t].value;
}
if (bound(t + 1,b) > bestp)
Backtrack(t + 1,b);
}
}
相關文章
- 01揹包問題理解動態規劃演算法動態規劃演算法
- 動態規劃 01揹包問題動態規劃
- 【動態規劃】01揹包問題動態規劃
- 動態規劃--01揹包問題動態規劃
- 動態規劃-01揹包問題動態規劃
- 【動態規劃】01揹包問題【續】動態規劃
- 詳解動態規劃01揹包問題--JavaScript實現動態規劃JavaScript
- 詳解動態規劃01揹包問題–JavaScript實現動態規劃JavaScript
- 動態規劃-揹包01問題推理與實踐動態規劃
- 前端與演算法-動態規劃之01揹包問題淺析與實現前端演算法動態規劃
- 動態規劃系列之六01揹包問題動態規劃
- 【動態規劃】一次搞定三種揹包問題動態規劃
- 【動態規劃】揹包問題動態規劃
- 揹包問題----動態規劃動態規劃
- 演算法-動態規劃-完全揹包演算法動態規劃
- 揹包問題演算法全解析:動態規劃和貪心演算法詳解演算法動態規劃
- 動態規劃篇——揹包問題動態規劃
- 動態規劃解0-1揹包問題動態規劃
- 0-1揹包問題(動態規劃)動態規劃
- 動態規劃之 0-1 揹包問題詳解動態規劃
- 01揹包動態規劃空間優化動態規劃優化
- 01揹包問題的解決
- 動態規劃之0,1揹包問題動態規劃
- 【動態規劃】0-1揹包問題原理和實現動態規劃
- 【LeetCode動態規劃#06】分割等和子集(01揹包問題一維寫法實戰)LeetCode動態規劃
- 【每日演算法】動態規劃四演算法動態規劃
- 用各種方法解01揹包
- python 動態規劃(揹包問題和最長公共子串)Python動態規劃
- 揹包問題(01揹包與完全揹包)
- [資料結構與演算法]-動態規劃之揹包演算法終極版資料結構演算法動態規劃
- Leetcode 題解演算法之動態規劃LeetCode演算法動態規劃
- 01揹包問題
- 01 揹包問題
- 前端學習演算法2: 揹包問題 ,一步一步思考(動態規劃入門)前端演算法動態規劃
- javascript演算法基礎之01揹包,完全揹包,多重揹包實現JavaScript演算法
- 最小總和問題(動態規劃演算法)動態規劃演算法
- 【LeetCode動態規劃#10】完全揹包問題實戰,其三(單詞拆分,涉及集合處理字串)LeetCode動態規劃字串
- 程式碼隨想錄演算法訓練營第41天 | 01揹包問題 二維 、 01揹包問題 一維 、 416. 分割等和子集演算法