动态规划求解0-1背包
2014-05-03 23:55
169 查看
C代码实现如下:
#include <stdio.h> #include <stdlib.h> int** DP(int num, int Weight, int*w, int *v); void output(int *c, int *w, int weight, int **ptr, int num); int main() { int w[] = {3, 4, 7, 8, 9}; int v[] = {4, 5, 10, 11, 13}; int num = 5, weight = 17; int out[5] = {0}; int i = 0, j = 0; int **ptr = NULL; ptr = DP(num, weight, w, v); output(out, w, weight, ptr, num); for(i = 0; i< num; i++) { for(j = 0; j < weight + 1; j++) { printf("%2d ", ptr[i][j]); } printf("\n"); free(ptr[i]); ptr[i] = NULL; } printf("\n"); free(ptr); ptr = NULL; for(i = 0; i < num; i++) { printf("%d ", out[i]); } printf("\n"); system("pause"); return 0; } int** DP(int num, int Weight, int*w, int *v) { int **arr = (int**)calloc(num, sizeof(int*)); int i = 0, j = 0; for(i = 0; i < num; i++) { arr[i] = (int*)calloc(Weight + 1, sizeof(int)); } for(i = 0; i < Weight + 1; i++) { arr[0][i] = 0; } for(i = 0; i < num; i++) { arr[i][0] = 0; for(j = 0; j < Weight + 1; j++) { if(w[i] <= j) { if(i == 0) { arr[i][j] = v[i]; } else { if(v[i] + arr[i - 1][j - w[i]] >= arr[i - 1][j]) { arr[i][j] = v[i] + arr[i-1][j- w[i]]; } else { arr[i][j] = arr[i - 1][j]; } } } else { if(i == 0) { arr[i][j] = 0; } else { arr[i][j] = arr[i - 1][j]; } } } } return arr; } void output(int *c, int *w, int weight, int **ptr, int num) { int i = 0; for(i = num - 1; i >=1; i--) { if(ptr[i][weight] == ptr[i - 1][weight]) { c[i] = 0; } else { c[i] = 1; weight -= w[i]; } } if(ptr[i][weight] == 0) { c[i] = 0; } else { c[i] = 1; } }
相关文章推荐
- 背包问题,动态规划求解,matlab代码,c++代码
- 0/1背包问题-----动态规划求解
- 用动态规划求解0-1背包问题
- 动态规划求解01背包相关的基本问题
- 《算法导论》读书笔记之第16章 0-1背包问题—动态规划求解
- 0/1背包问题(动态规划求解)
- 0-1背包问题及其动态规划求解之二——王晓东的书本解法
- 动态规划求解0-1背包问题
- 《算法导论》读书笔记之第16章 0-1背包问题—动态规划求解
- hdu2069Coin Change(暴力求解----动态规划(背包)求解---搜索--)
- 0-1背包问题,动态规划求解
- 用动态规划求解0-1背包问题
- 动态规划--C#求解01背包
- 算法导论第16章 贪心算法-0-1背包问题—动态规划求解
- 动态规划求解0-1背包问题
- 动态规划求解0/1背包
- 动态规划求解背包问题(java版本)
- Java 动态规划求解0-1背包问题
- 动态规划求解背包问题(JAVA实现)
- 物件捆绑 背包问题 动态规划 求解