参考一个既有的算法实现了背包问题,算法思路见程序注释。
View Code
1 /*
2 * Fredric 2012-3-27
3 * 背包问题
4 */
5 #include <stdio.h>
6 #include <stdlib.h>
7
8 #define N (100)
9
10 typedef enum E_STATUS{
11 E_STATUS_NO,
12 E_STATUS_YES,
13 };
14
15 typedef struct tagNode{
16 double weight;
17 double value;
18 }stNode;
19
20 int num = 6;
21 stNode gNode[N] = {{5,4},{3,4},{2,3},{1,1},{2,2},{3,4}};
22 E_STATUS etempRes[N]; //临时解
23 E_STATUS eFinalRes[N]; //最终解
24
25
26 double limitWeight = 14;
27 double totalValue;
28 double maxValue;
29
30 /*
31 * 确认第i个背包是否被选择
32 * i:第i个背包选择的可能;
33 * weight:当前选择的总重量
34 * value: 当前选择可能到达的最大价值
35 *
36 * 该算法的实现相当于遍历每个背包选中或不选中的所有可能
37 */
38 void search(int i, double weight, double value){
39
40 //背包i可以被选中
41 if (gNode[i].weight + weight < limitWeight)
42 {
43 etempRes[i] = E_STATUS_YES;
44 if (i < num){
45 search(i + 1, gNode[i].weight + weight, value);
46 }else{
47 for (int i = 0; i < num; i++)
48 {
49 eFinalRes[i] = etempRes[i];
50 }
51 maxValue = value;
52 }
53
54 etempRes[i] = E_STATUS_NO;
55 }
56
57 if (value - gNode[i].value > maxValue)
58 {
59 if (i < num){
60 search(i + 1, weight, value - gNode[i].value);
61 }else{
62 for (int i = 0; i < num; i++)
63 {
64 eFinalRes[i] = etempRes[i];
65 }
66
67 maxValue = value - gNode[i].value;
68 }
69 }
70
71 return;
72 }
73
74
75
76 void main(void)
77 {
78
79 for (int i = 0; i < num; i++)
80 {
81 eFinalRes[i] = E_STATUS_NO;
82 etempRes[i] = E_STATUS_NO;
83 totalValue += gNode[i].value;
84 }
85
86 search(0, 0.0, totalValue);
87
88 for (i = 0; i < num; i++)
89 {
90 printf("No.%d status:%d\r\n", i, eFinalRes[i]);
91 }
92
93 system("pause");
94
95 return;
96 }