拾荒时代------技术,艺术!

.NET/Ajax/C#/Web2.0精品技术文章网摘。

导航

用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                 getreturn 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                 setthis.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[100100];
 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                 getreturn 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 }

posted on 2007-06-20 22:47  拾荒时代  阅读(282)  评论(0编辑  收藏  举报