又要出差了,也不知道多久才能回来,这段时间应该都不能更新博客了,写了0-1背包程序热热手吧。
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 #define MAX_NUM 20 //物品最大个数 5 #define MAX_PACK 100 //背包容量 6 7 int result[MAX_NUM][MAX_PACK]; //全局变量默认初始化0 8 9 /* 10 * 0 1背包问题动态规划方程 11 * 12 * m[i][j]代表已经选完前i-1个物品背包容量剩余j时的最大值 13 * 14 * m[i][j] = { 15 * 0 j = 0 || i = 0; 16 * m[i-1][j] j < weight[i]; 17 * max(m[i-1][j],m[i-1][j-weight[i]] + value[i]) j >= weight[i]; 18 * } 19 * 20 */ 21 22 23 /*获取最大值得计算函数*/ 24 int knapsack(int weight[],int value[],int n,int m) 25 { 26 int i,j; 27 28 for(i = 1; i < n; i++) 29 { 30 for(j = 1; j <= m; j++) 31 {//j 包含m 32 if(weight[i] <= j) 33 {//背包能放下该物品 34 if(result[i-1][j-weight[i]] + value[i] >= result[i-1][j]) 35 { 36 result[i][j] = result[i-1][j-weight[i]] + value[i]; 37 } 38 else 39 { 40 result[i][j] = result[i-1][j]; 41 } 42 } 43 else 44 {//背包不能放下该物品 45 result[i][j] = result[i-1][j]; 46 } 47 } 48 } 49 50 return result[n - 1][m]; 51 } 52 53 /*构造0 1背包的最优解---即哪些物品被选中了*/ 54 int knapsack_construct(int weight[],int n,int m,int selected[]) 55 { 56 int i,contains; 57 58 contains = m; 59 for(i = n - 1; i > 0; i--) 60 { 61 if(result[i][contains] > result[i - 1][contains]) 62 {//说明放了第i个物品 63 selected[i] = 1; 64 contains -= weight[i]; //更新背包容量 65 } 66 else 67 { 68 selected[i] = 0; 69 } 70 71 } 72 } 73 74 75 int main() 76 { 77 int i,weight[MAX_NUM],value[MAX_NUM],m,n; 78 int selected[MAX_NUM]; 79 80 scanf("%d%d",&n,&m); 81 82 for(i = 0; i < n; i++) 83 { 84 scanf("%d%d",&weight[i],&value[i]); 85 } 86 87 int max_value = knapsack(weight,value,n,m); 88 printf("最大背包价值:%d\n",max_value); 89 90 knapsack_construct(weight,n,m,selected); 91 92 for(i = 0; i < n; i++) 93 { 94 if(selected[i] == 1) 95 { 96 printf("%d ",i + 1); 97 } 98 } 99 100 printf("\n"); 101 }
时间: 2024-10-06 03:38:03