c++實現0-1揹包問題完整原始碼(動態規劃實現)
阿新 • • 發佈:2019-01-06
轉自:東風破的部落格 http://blog.sina.com.cn/jaydongfengpo
- #include
- #define MAX_NUM 5
- #define MAX_WEIGHT 10
- usingnamespace std;
- //動態規劃求解
- int zero_one_pack(int total_weight, int w[], int v[], int flag[], int n) {
- int c[MAX_NUM+1][MAX_WEIGHT+1] = {0}; //c[i][j]表示前i個物體放入容量為j的揹包獲得的最大價值
-
// c[i][j] = max{c[i-1][j], c[i-1][j-w[i]]+v[i]}
- //第i件物品要麼放,要麼不放
- //如果第i件物品不放的話,就相當於求前i-1件物體放入容量為j的揹包獲得的最大價值
- //如果第i件物品放進去的話,就相當於求前i-1件物體放入容量為j-w[i]的揹包獲得的最大價值
- for (int i = 1; i <= n; i++) {
- for (int j = 1; j <= total_weight; j++) {
- if (w[i] > j) {
- // 說明第i件物品大於揹包的重量,放不進去
- c[i][j] = c[i-1][j];
-
} else {
- //說明第i件物品的重量小於揹包的重量,所以可以選擇第i件物品放還是不放
- if (c[i-1][j] > v[i]+c[i-1][j-w[i]]) {
- c[i][j] = c[i-1][j];
- }
- else {
- c[i][j] = v[i] + c[i-1][j-w[i]];
- }
- }
- }
- }
- //下面求解哪個物品應該放進揹包
-
int i = n, j = total_weight;
- while (c[i][j] != 0) {
- if (c[i-1][j-w[i]]+v[i] == c[i][j]) {
- // 如果第i個物體在揹包,那麼顯然去掉這個物品之後,前面i-1個物體在重量為j-w[i]的揹包下價值是最大的
- flag[i] = 1;
- j -= w[i];
- --i;
- }
- }
- return c[n][total_weight];
- }
- //回溯法求解
- int main() {
- int total_weight = 10;
- int w[4] = {0, 3, 4, 5};
- int v[4] = {0, 4, 5, 6};
- int flag[4]; //flag[i][j]表示在容量為j的時候是否將第i件物品放入揹包
- int total_value = zero_one_pack(total_weight, w, v, flag, 3);
- cout << "需要放入的物品如下" << endl;
- for (int i = 1; i <= 3; i++) {
- if (flag[i] == 1)
- cout << i << "重量為" << w[i] << ", 價值為" << v[i] << endl;
- }
- cout << "總的價值為: " << total_value << endl;
- return 0;
- }