此篇博文待完善。
1234567
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;
}
1234567
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
#includeusing 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 表示當前正在搜尋的部分解中轉入的...