C#解决01背包问题

这是一个使用C#编写的解决01背包问题的示例。通过定义`Product`和`Bag`类来分别存储商品信息和背包状态,利用动态规划的方法找到背包能容纳的最大价值。程序提供添加商品、设定背包容量以及展示购买结果的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

using System;
using System.Collections;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
namespace Test01Bag
{
    
public partial class Form1 : Form
    {
        
public Form1()
        {
            InitializeComponent();
        }
        
public class Product
        {
            
#region 商品类
            
/// <summary>
            
/// 商品重量泛型List存储
            
/// </summary>
            private List<int> weight = new List<int>();

            
public List<int> Weight
            {
                
getreturn weight; }
                
set{ weight = value; }
            }
            
private List<int> value = new List<int>();
            
/// <summary>
            
/// 商品价值泛型List存储
            
/// </summary>
            public List<int> Value
            {
                
get { return this.value; }
                
setthis.value = value; }
            }
            
private int count;
            
/// <summary>
            
/// 商品数量
            
/// </summary>
            public int Count
            {
                
get
                {
                    count 
= weight.Count;
                    
return count;
                }
            }
            
/// <summary>
            
/// 添加商品信息
            
/// </summary>
            
/// <param name="w">重量</param>
            
/// <param name="v">价值</param>
            
/// <returns></returns>
            public int setWeightAddValve(int w, int v)
            {
                weight.Add(w);
                value.Add(v);
                
return weight.Count;
            } 
            
#endregion
        }
        
public class Bag
        {
            
#region 背包类
            
int[,] help = new int[100100];
            
int[] weight = new int[100];
            
int[] value = new int[100];
            
int count;
            
int temp;
            
// 背包容量
            private int valume;
            
public int Valume
            {
                
getreturn valume; }
                
set { valume = value; }
            }
            
private int maxvalue;

            
public int Maxvalue
            {
                
get { return maxvalue; }
                
set{ maxvalue = value; }
            }
            
/// <summary>
            
/// 设定容量temp暂存
            
/// </summary>
            
/// <param name="v"></param>
            public void setValume(int v)
            {
                valume 
= v;
                temp 
= valume;
            }
            
/// <summary>
            
/// 引入数据
            
/// </summary>
            
/// <param name="newprd">Product</param>
            public void setProduct(Product newprd)
            {
                count 
= newprd.Count;
                weight 
= newprd.Weight.ToArray();
                value 
= newprd.Value.ToArray();
            }
            
/// <summary>
            
/// 买商品
            
/// </summary>
            
/// <returns></returns>
            public int buyproduct()
            {
                
//初始化help表第一行为零
                for (int w = 0; w < valume; w++)
                {
                    help[
0, w] = 0;
                }
                
for (int i = 1; i <= count; i++)
                {
                    
// //初始化help表第一l列为零
                    help[i, 0= 0;
                    
for (int w = 1; w <= valume; w++)
                    {
                        
int temp = w - weight[i - 1];
                        
if (weight[i - 1<= w)
                        {
                            
if (value[i - 1+ help[i - 1, temp] > help[i - 1, w])
                            {
                                help[i, w] 
= value[i - 1+ help[i - 1, temp];
                            }
                            
else
                            {
                                help[i, w] 
= help[i - 1, w];
                            }
                        }
                        
else
                        {
                            help[i, w] 
= help[i - 1, w];
                        }
                    }
                }
                maxvalue 
= help[count, valume];
                
return maxvalue;
            }
            
/// <summary>
            
/// 显示结果买的商品状态存入ArrayList
            
/// </summary>
            
/// <returns></returns>
            public ArrayList showResult()
            {
                ArrayList result 
= new ArrayList();
                
if (weight[0== help[1, temp])
                {
                    result.Add(
"Buy!");
                }
                
else
                {
                    result.Add(
"Not Buy!");
                }
                
if (count >= 2)
                {
                    
for (int i = count; i <= 2; i--)
                    {
                        
if (help[i, temp] == help[i - 1, temp])
                        {
                            result.Add(
"Not Buy!");
                        }
                        
else
                        {
                            result.Add(
"Buy!");
                        }
                        temp 
= temp - weight[i - 1];
                    }
                }
                
return result;
            } 
            
#endregion
        }
        
/// <summary>
        
/// 实例化
        
/// </summary>
        Product newproduct = new Product();
        Bag newbag 
= new Bag();
        
int i=1;
        
private void Form1_Load(object sender, EventArgs e)
        {
            
///初始化
            onit();
        }
     
public  void onit()
        {
            
#region 程序初始化
         
//清空
            newproduct.Value.Clear();
            newproduct.Weight.Clear();
            newbag.Valume 
= 0;
            lstboxResult.Items.Clear(); 
            
#endregion
        }
        
/// <summary>
        
/// 存储商品信息函数
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void btnAddProduct_Click(object sender, EventArgs e)
        {
            
#region 添加商品信息
            
try
            {

                
int w = Convert.ToInt32(txtWeight.Text);
                
int v = Convert.ToInt32(txtValue.Text);
                newproduct.setWeightAddValve(w, v);
                i
++;
                label1.Text 
= "请输入商品(" + i.ToString() + ")的体积:";
                label3.Text 
= "请输入商品(" + i.ToString() + ")的价值:";
                txtWeight.Text 
= "";
                txtValue.Text 
= "";
            }
            
catch
            {

                MessageBox.Show(
"你的输入有错误,请重新输入!");
                
return;
            }
            
            
#endregion
        }
        
/// <summary>
        
/// 问题解决函数
        
/// </summary>
        
/// <param name="sender"></param>
        
/// <param name="e"></param>
        private void btnToBuy_Click(object sender, EventArgs e)
        {
            
#region 解决背包问题
            
try
            {
                
int i = 1;
                
int v = Convert.ToInt32(txtValume.Text);
                newbag.setValume(v);
                txtValume.Text 
= "";
                newbag.setProduct(newproduct);
                
int x = newbag.buyproduct();
                lblMaxvalue.Text 
= "最大价值为:" + newbag.buyproduct().ToString();
                ArrayList result 
= newbag.showResult();
                
int f = result.Count;
                
foreach (string str in result)
                {
                    
string message = "商品" + i.ToString() + "--------" + str;
                    lstboxResult.Items.Add(message);
                    i
++;
                }
                onit();
            }
            
catch
            {
                MessageBox.Show(
"你的输入有错误,请重新输入!");
                
return;
            } 
            
#endregion
                     
        }
    }
}
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值