关于背包问题的实践
来源:互联网 发布:数据库 关系图 编辑:程序博客网 时间:2024/05/21 10:39
前几天看到网上有人求助如何实现背包问题,于是自己花了一个下午尝试解决:
问题:
有n个商品,每个商品价格是一个整数,给定一个整数,求所有商品价格和等于这个整数的组合。
解法:
定义商品类:
/// <summary>
/// 商品类
/// </summary>
public class Goods
{
public string Name { get; set; }
public int Price { get; set; }
}
定义测试类,可以得到商品组合的类:
public class Test
{
private List<Goods> goodList;
private int _totalprice;
public Test(int totalprice)
{
//以下是自测试随机生成商品和价格列表,实际应用中可以用select语句获取所有单价小于totalprice的商品列表
goodList = new List<Goods>();
for (int i = 0; i < 5; i++)
{
goodList.Add(new Goods()
{
Name = string.Format("第{0}个商品", (i + 1).ToString()),
Price = (i+1)*10
});
}
_totalprice=totalprice;
}
public List<List<Goods>> GetAllSelection()
{
List<Goods> nowgoods=new List<Goods>();
List<List<Goods>> result = getSel(_totalprice, nowgoods);
return result;
}
private List<List<Goods>> getSel(int total, List<Goods> nowgoods)
{
List<List<Goods>> goods = new List<List<Goods>>();
for (int i = 0; i < goodList.Count; i++)
{
if (goodList[i].Price == total)
{
goods.Add(new List<Goods>());
goods[goods.Count - 1].AddRange(nowgoods);
goods[goods.Count - 1].Add(goodList[i]);
}
else if (goodList[i].Price < total)
{
nowgoods.Add(goodList[i]);
goods.AddRange(getSel(total - goodList[i].Price, nowgoods));
nowgoods.RemoveAt(nowgoods.Count - 1);
}
}
return goods;
}
}
调用类:
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
Test test = new Test(100);
List<List<Goods>> resulttest = test.GetAllSelection();
StringBuilder sb=new StringBuilder();
for (int i = 0; i < resulttest.Count;i++ )
{
sb.Append("\r\n");
for (int j = 0; j < resulttest[i].Count;j++ )
{
sb.Append(resulttest[i][j].Price.ToString() + ",");
}
}
Console.WriteLine(sb.ToString());
}
}
测试通过。
问题有两个:
1.容易生成重复组合
2.当给定总额增加时,计算时间增加
- 关于背包问题的实践
- 关于01背包的问题
- 关于背包问题的研究
- 关于恰好装满背包的背包问题的理解
- 关于背包问题的二进制优化
- 关于背包问题的递归解法
- 关于背包问题的进一步优化
- poj2184 Cow Exhibition(带负数的背包问题)(关于背包问题的精髓可以去百度背包九讲)
- 关于变形的背包问题的答案(C版)
- 关于完全背包问题用二进制优化的可行性证明
- 关于背包问题的一点点笔记(随时补充)
- 关于0-1背包问题的个人理解
- 关于动态规划------背包问题
- 关于背包的注意事项
- POJ 3624 Charm Bracelet【裸01背包和关于贪心解 01 背包问题的思考】
- 关于两个对象交换的问题(实践的角度)
- 关于Dubbo自行实践的知识与解决的问题
- 变形的背包问题
- 微信小程序 input 的 type属性 text、number、idcard、digit 区别
- [LeetCode]119. Pascal's Triangle II
- 【笔记+实战】Logistics Regression
- 分治——大整数乘法
- SpringBoot弹出引导错误java.lang.NoSuchMethodError:org.apache.tomcat.util.scan.StandardJarScanner.setJarSca
- 关于背包问题的实践
- [Leetcode] 458. Poor Pigs
- vscode 修改默认 Markdown 预览样式
- HTML5的FileReader的使用
- FineBI表单如何更新
- Algorithm学习笔记 --- 大数阶乘算法模板
- SourceTree初始设置及其使用
- 数据分析师职业规划
- Unity 烘焙贴图后再拖成预设体后场景光照信息丢失