演算法 0 1揹包的動態規劃,回溯,分支限界三種解法

2021-07-22 22:35:18 字數 3782 閱讀 4145

此篇博文待完善。

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

5859

6061

6263

6465

6667

6869

7071

7273

7475

7677

7879

8081

8283

8485

8687

8889

9091

9293

9495

9697

9899

#include

#include

#include

int traceback(int **map, int n, int *x, int max_weight, int *weight);

int knaspack(int *weight, int * value, int max_weight, int n, int **map);

int max(int m,int n);

int min(int m,int n);

int main()

; //一維陣列,存有每個物品的重量,weight[0]存為0,無實際意義。

int value = ; //一維陣列,存有每個物品的價值,同上。

int max_weight = 10; //揹包所能放的最大重量。

int n = sizeof(weight) / sizeof(weight[0]) - 1; //n:物品的個數。

int **map =(int **)malloc(sizeof(int *) * (n + 1)); //二維陣列map作為地圖,行數為n+1,列數為max_weight+1;

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

int *x = (int *)malloc(sizeof(int) * (n + 1)); //一維陣列x儲存結果

knaspack(weight, value, max_weight, n, map); //填表

traceback(map, n, x, max_weight, weight); //由表得出結果

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

printf("%d\n",map[1][max_weight]);

return 0;

}int knaspack(int *weight, int * value, int max_weight, int n, int **map)

for(j = weight[n]; j < max_weight; j++)

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

for(j = weight[i]; j <= max_weight; j++)

}map[1][max_weight] = map[2][max_weight];

if(max_weight >= weight[1])

}int max(int m,int n)

else

}int min(int m,int n)

else

}int traceback(int **map, int n, int *x, int max_weight, int *weight)

else

}x[n] = (map[n][max_weight])? 1 : 0;

}

123

4567

891011

1213

1415

1617

1819

2021

2223

2425

2627

2829

3031

3233

3435

3637

3839

4041

4243

4445

4647

4849

5051

5253

5455

5657

5859

6061

6263

6465

6667

6869

7071

7273

7475

7677

7879

8081

8283

8485

8687

8889

9091

9293

9495

9697

9899

100101

102103

104105

106107

108109

110111

112113

114115

116117

118119

120121

122123

124125

126127

128129

130131

132

#include

using namespace std;

float knapsack(float *p, int *w , int c, int n);

int sort(float *p, int *w, int n);

class knap;

void knap::backtrack(int i)

if(cw + w[i] <= c)

if(bound(i + 1) > bestp)

}float knap::bound(int i) //計算上界

if (i <= n)

return b;

}float knapsack(float *p, int *w , int c, int n)

k.cp = 0;

k.cw = 0;

k.c = c;

k.n = n;

k.bestp = 0;

k.backtrack(1);

delete k.w;

delete k.p;

return k.bestp;

}int sort(float *p, int *w, int n) //排序函式(冒泡)

}if(swap == 0)

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

}int main()

;float value = ;

int max_weight = 10;

int n = sizeof(weight) / sizeof(weight[0]) - 1;

float answer = knapsack(value,weight,max_weight,n);

cout<

return 0;

}

01揹包(動態規劃(回溯))

include 所謂動態規劃,就是分治策略加上不同的區域之間相互影響,如何從區域性最優解,到全域性最優解,這便是我們所關注的重點,因為還是分割成一塊一塊的,遞迴入手更好去理解。現有n件物品,其中第i件物品的重量為w i 價值為v i 有一容量為j的揹包,求在不超過揹包容量的情況下,使取得的商品的價值...

動態規劃 回溯法實現0 1揹包

v i,j 表示在前i 1 i n 個物品中能夠裝入容量為j 1 j c 的揹包中的物品的最大值 v i,0 v 0,j 0 式1 式2 式1表明 把前面i個物品裝入容量為0的揹包和把0個物品裝入容量為j的揹包,得到的價值均為0 式2的第乙個式子表明 如果第i個物品的重量大於揹包的容量,則物品i不能...

0 1揹包問題 動態規劃 回溯 分支限界法對比

2017.12.19 20 42 02 字數 3713 閱讀 2820 假定n個商品重量分別為w0,w1,wn 1,價值分別為p0,p1,pn 1,揹包載重量為m。怎樣選擇商品組合,使得價值最高?最大值的估算法 跟分支限界法本質上是一樣的 向上回溯的方法 w cur 表示當前正在搜尋的部分解中轉入的...