用C#解决0-1背包问题
1 using System;
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.ComponentModel;
5 using System.Data;
6 using System.Drawing;
7 using System.Text;
8 using System.Windows.Forms;
9 namespace Test01Bag
10 {
11 public partial class Form1 : Form
12 {
13 public Form1()
14 {
15 InitializeComponent();
16 }
17 public class Product
18 {
19 #region 商品类
20 /// <summary>
21 /// 商品重量泛型List存储
22 /// </summary>
23 private List<int> weight = new List<int>();
24
25 public List<int> Weight
26 {
27 get{ return weight; }
28 set{ weight = value; }
29 }
30 private List<int> value = new List<int>();
31 /// <summary>
32 /// 商品价值泛型List存储
33 /// </summary>
34 public List<int> Value
35 {
36 get { return this.value; }
37 set{ this.value = value; }
38 }
39 private int count;
40 /// <summary>
41 /// 商品数量
42 /// </summary>
43 public int Count
44 {
45 get
46 {
47 count = weight.Count;
48 return count;
49 }
50 }
51 /// <summary>
52 /// 添加商品信息
53 /// </summary>
54 /// <param name="w">重量</param>
55 /// <param name="v">价值</param>
56 /// <returns></returns>
57 public int setWeightAddValve(int w, int v)
58 {
59 weight.Add(w);
60 value.Add(v);
61 return weight.Count;
62 }
63 #endregion
64 }
65 public class Bag
66 {
67 #region 背包类
68 int[,] help = new int[100, 100];
69 int[] weight = new int[100];
70 int[] value = new int[100];
71 int count;
72 int temp;
73 // 背包容量
74 private int valume;
75 public int Valume
76 {
77 get{ return valume; }
78 set { valume = value; }
79 }
80 private int maxvalue;
81
82 public int Maxvalue
83 {
84 get { return maxvalue; }
85 set{ maxvalue = value; }
86 }
87 /// <summary>
88 /// 设定容量temp暂存
89 /// </summary>
90 /// <param name="v"></param>
91 public void setValume(int v)
92 {
93 valume = v;
94 temp = valume;
95 }
96 /// <summary>
97 /// 引入数据
98 /// </summary>
99 /// <param name="newprd">Product</param>
100 public void setProduct(Product newprd)
101 {
102 count = newprd.Count;
103 weight = newprd.Weight.ToArray();
104 value = newprd.Value.ToArray();
105 }
106 /// <summary>
107 /// 买商品
108 /// </summary>
109 /// <returns></returns>
110 public int buyproduct()
111 {
112 //初始化help表第一行为零
113 for (int w = 0; w < valume; w++)
114 {
115 help[0, w] = 0;
116 }
117 for (int i = 1; i <= count; i++)
118 {
119 // //初始化help表第一l列为零
120 help[i, 0] = 0;
121 for (int w = 1; w <= valume; w++)
122 {
123 int temp = w - weight[i - 1];
124 if (weight[i - 1] <= w)
125 {
126 if (value[i - 1] + help[i - 1, temp] > help[i - 1, w])
127 {
128 help[i, w] = value[i - 1] + help[i - 1, temp];
129 }
130 else
131 {
132 help[i, w] = help[i - 1, w];
133 }
134 }
135 else
136 {
137 help[i, w] = help[i - 1, w];
138 }
139 }
140 }
141 maxvalue = help[count, valume];
142 return maxvalue;
143 }
144 /// <summary>
145 /// 显示结果买的商品状态存入ArrayList
146 /// </summary>
147 /// <returns></returns>
148 public ArrayList showResult()
149 {
150 ArrayList result = new ArrayList();
151 if (weight[0] == help[1, temp])
152 {
153 result.Add("Buy!");
154 }
155 else
156 {
157 result.Add("Not Buy!");
158 }
159 if (count >= 2)
160 {
161 for (int i = count; i <= 2; i--)
162 {
163 if (help[i, temp] == help[i - 1, temp])
164 {
165 result.Add("Not Buy!");
166 }
167 else
168 {
169 result.Add("Buy!");
170 }
171 temp = temp - weight[i - 1];
172 }
173 }
174 return result;
175 }
176 #endregion
177 }
178 /// <summary>
179 /// 实例化
180 /// </summary>
181 Product newproduct = new Product();
182 Bag newbag = new Bag();
183 int i=1;
184 private void Form1_Load(object sender, EventArgs e)
185 {
186 ///初始化
187 onit();
188 }
189 public void onit()
190 {
191 #region 程序初始化
192 //清空
193 newproduct.Value.Clear();
194 newproduct.Weight.Clear();
195 newbag.Valume = 0;
196 lstboxResult.Items.Clear();
197 #endregion
198 }
199 /// <summary>
200 /// 存储商品信息函数
201 /// </summary>
202 /// <param name="sender"></param>
203 /// <param name="e"></param>
204 private void btnAddProduct_Click(object sender, EventArgs e)
205 {
206 #region 添加商品信息
207 try
208 {
209
210 int w = Convert.ToInt32(txtWeight.Text);
211 int v = Convert.ToInt32(txtValue.Text);
212 newproduct.setWeightAddValve(w, v);
213 i++;
214 label1.Text = "请输入商品(" + i.ToString() + ")的体积:";
215 label3.Text = "请输入商品(" + i.ToString() + ")的价值:";
216 txtWeight.Text = "";
217 txtValue.Text = "";
218 }
219 catch
220 {
221
222 MessageBox.Show("你的输入有错误,请重新输入!");
223 return;
224 }
225
226 #endregion
227 }
228 /// <summary>
229 /// 问题解决函数
230 /// </summary>
231 /// <param name="sender"></param>
232 /// <param name="e"></param>
233 private void btnToBuy_Click(object sender, EventArgs e)
234 {
235 #region 解决背包问题
236 try
237 {
238 int i = 1;
239 int v = Convert.ToInt32(txtValume.Text);
240 newbag.setValume(v);
241 txtValume.Text = "";
242 newbag.setProduct(newproduct);
243 int x = newbag.buyproduct();
244 lblMaxvalue.Text = "最大价值为:" + newbag.buyproduct().ToString();
245 ArrayList result = newbag.showResult();
246 int f = result.Count;
247 foreach (string str in result)
248 {
249 string message = "商品" + i.ToString() + "--------" + str;
250 lstboxResult.Items.Add(message);
251 i++;
252 }
253 onit();
254 }
255 catch
256 {
257 MessageBox.Show("你的输入有错误,请重新输入!");
258 return;
259 }
260 #endregion
261
262 }
263 }
264 }
2 using System.Collections;
3 using System.Collections.Generic;
4 using System.ComponentModel;
5 using System.Data;
6 using System.Drawing;
7 using System.Text;
8 using System.Windows.Forms;
9 namespace Test01Bag
10 {
11 public partial class Form1 : Form
12 {
13 public Form1()
14 {
15 InitializeComponent();
16 }
17 public class Product
18 {
19 #region 商品类
20 /// <summary>
21 /// 商品重量泛型List存储
22 /// </summary>
23 private List<int> weight = new List<int>();
24
25 public List<int> Weight
26 {
27 get{ return weight; }
28 set{ weight = value; }
29 }
30 private List<int> value = new List<int>();
31 /// <summary>
32 /// 商品价值泛型List存储
33 /// </summary>
34 public List<int> Value
35 {
36 get { return this.value; }
37 set{ this.value = value; }
38 }
39 private int count;
40 /// <summary>
41 /// 商品数量
42 /// </summary>
43 public int Count
44 {
45 get
46 {
47 count = weight.Count;
48 return count;
49 }
50 }
51 /// <summary>
52 /// 添加商品信息
53 /// </summary>
54 /// <param name="w">重量</param>
55 /// <param name="v">价值</param>
56 /// <returns></returns>
57 public int setWeightAddValve(int w, int v)
58 {
59 weight.Add(w);
60 value.Add(v);
61 return weight.Count;
62 }
63 #endregion
64 }
65 public class Bag
66 {
67 #region 背包类
68 int[,] help = new int[100, 100];
69 int[] weight = new int[100];
70 int[] value = new int[100];
71 int count;
72 int temp;
73 // 背包容量
74 private int valume;
75 public int Valume
76 {
77 get{ return valume; }
78 set { valume = value; }
79 }
80 private int maxvalue;
81
82 public int Maxvalue
83 {
84 get { return maxvalue; }
85 set{ maxvalue = value; }
86 }
87 /// <summary>
88 /// 设定容量temp暂存
89 /// </summary>
90 /// <param name="v"></param>
91 public void setValume(int v)
92 {
93 valume = v;
94 temp = valume;
95 }
96 /// <summary>
97 /// 引入数据
98 /// </summary>
99 /// <param name="newprd">Product</param>
100 public void setProduct(Product newprd)
101 {
102 count = newprd.Count;
103 weight = newprd.Weight.ToArray();
104 value = newprd.Value.ToArray();
105 }
106 /// <summary>
107 /// 买商品
108 /// </summary>
109 /// <returns></returns>
110 public int buyproduct()
111 {
112 //初始化help表第一行为零
113 for (int w = 0; w < valume; w++)
114 {
115 help[0, w] = 0;
116 }
117 for (int i = 1; i <= count; i++)
118 {
119 // //初始化help表第一l列为零
120 help[i, 0] = 0;
121 for (int w = 1; w <= valume; w++)
122 {
123 int temp = w - weight[i - 1];
124 if (weight[i - 1] <= w)
125 {
126 if (value[i - 1] + help[i - 1, temp] > help[i - 1, w])
127 {
128 help[i, w] = value[i - 1] + help[i - 1, temp];
129 }
130 else
131 {
132 help[i, w] = help[i - 1, w];
133 }
134 }
135 else
136 {
137 help[i, w] = help[i - 1, w];
138 }
139 }
140 }
141 maxvalue = help[count, valume];
142 return maxvalue;
143 }
144 /// <summary>
145 /// 显示结果买的商品状态存入ArrayList
146 /// </summary>
147 /// <returns></returns>
148 public ArrayList showResult()
149 {
150 ArrayList result = new ArrayList();
151 if (weight[0] == help[1, temp])
152 {
153 result.Add("Buy!");
154 }
155 else
156 {
157 result.Add("Not Buy!");
158 }
159 if (count >= 2)
160 {
161 for (int i = count; i <= 2; i--)
162 {
163 if (help[i, temp] == help[i - 1, temp])
164 {
165 result.Add("Not Buy!");
166 }
167 else
168 {
169 result.Add("Buy!");
170 }
171 temp = temp - weight[i - 1];
172 }
173 }
174 return result;
175 }
176 #endregion
177 }
178 /// <summary>
179 /// 实例化
180 /// </summary>
181 Product newproduct = new Product();
182 Bag newbag = new Bag();
183 int i=1;
184 private void Form1_Load(object sender, EventArgs e)
185 {
186 ///初始化
187 onit();
188 }
189 public void onit()
190 {
191 #region 程序初始化
192 //清空
193 newproduct.Value.Clear();
194 newproduct.Weight.Clear();
195 newbag.Valume = 0;
196 lstboxResult.Items.Clear();
197 #endregion
198 }
199 /// <summary>
200 /// 存储商品信息函数
201 /// </summary>
202 /// <param name="sender"></param>
203 /// <param name="e"></param>
204 private void btnAddProduct_Click(object sender, EventArgs e)
205 {
206 #region 添加商品信息
207 try
208 {
209
210 int w = Convert.ToInt32(txtWeight.Text);
211 int v = Convert.ToInt32(txtValue.Text);
212 newproduct.setWeightAddValve(w, v);
213 i++;
214 label1.Text = "请输入商品(" + i.ToString() + ")的体积:";
215 label3.Text = "请输入商品(" + i.ToString() + ")的价值:";
216 txtWeight.Text = "";
217 txtValue.Text = "";
218 }
219 catch
220 {
221
222 MessageBox.Show("你的输入有错误,请重新输入!");
223 return;
224 }
225
226 #endregion
227 }
228 /// <summary>
229 /// 问题解决函数
230 /// </summary>
231 /// <param name="sender"></param>
232 /// <param name="e"></param>
233 private void btnToBuy_Click(object sender, EventArgs e)
234 {
235 #region 解决背包问题
236 try
237 {
238 int i = 1;
239 int v = Convert.ToInt32(txtValume.Text);
240 newbag.setValume(v);
241 txtValume.Text = "";
242 newbag.setProduct(newproduct);
243 int x = newbag.buyproduct();
244 lblMaxvalue.Text = "最大价值为:" + newbag.buyproduct().ToString();
245 ArrayList result = newbag.showResult();
246 int f = result.Count;
247 foreach (string str in result)
248 {
249 string message = "商品" + i.ToString() + "--------" + str;
250 lstboxResult.Items.Add(message);
251 i++;
252 }
253 onit();
254 }
255 catch
256 {
257 MessageBox.Show("你的输入有错误,请重新输入!");
258 return;
259 }
260 #endregion
261
262 }
263 }
264 }