惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

爱范儿
爱范儿
腾讯CDC
博客园 - 司徒正美
A
About on SuperTechFans
H
Help Net Security
J
Java Code Geeks
C
Check Point Blog
B
Blog RSS Feed
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
MongoDB | Blog
MongoDB | Blog
U
Unit 42
Hugging Face - Blog
Hugging Face - Blog
Last Week in AI
Last Week in AI
MyScale Blog
MyScale Blog
V
Visual Studio Blog
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
I
InfoQ
H
Hackread – Cybersecurity News, Data Breaches, AI and More
F
Fortinet All Blogs
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
GbyAI
GbyAI
博客园 - 【当耐特】
雷峰网
雷峰网

博客园 - 废墟中的垃圾

Android 学习笔记一 -- 环境搭建 DOTNET网站中级程序员招聘 同时招聘其他职位 windows 2003 和 windows xp 下安装 Windows Phone Developer Tools RTW(sdk) 微博关注其实图标可以自己定义:) Google map api 3.9 Directions 相关的服务 Google map api 3.9 Service Geocoder 地理信息解析 Google map api 3.9 Service 服务相关 pmropn.exe 暂用cpu 的解决办法 免费百度刷下拉 刷联想词软件,共享出来,大家共勉 商城SEO - 当前关键词的设定 真正解决方案:无法启动调试--未安装 Silverlight Developer 运行时。请安装一个匹配版本。 SEO研究中心第三版优化教程(扫描版)目录添加版 framework4.0 预先需要安装的系统组件 SQLServer ERRORLOG 删除 CodeSmith 学习之数据库遍历数据库表的所有字段 Google map api v3 Services —— Elevation 在 Google map api v3 里面使用 海拔对象 Google Map —— The Google Elevation API Google map v3 发布 关于 server.urlencode 中文乱码的问题 asp 和 .net 都说明一下
老魏帮忙发的木棒问题的最大长度优先匹配原则算法
废墟中的垃圾 · 2011-06-22 · via 博客园 - 废墟中的垃圾

老魏帮忙发的木棒问题的最大长度优先匹配原则算法

2011-06-22 17:14  废墟中的垃圾  阅读(413)  评论()    收藏  举报

老魏帮忙发的问题的地址

http://www.cnblogs.com/eastjade/archive/2011/06/22/2086828.html

下面是算法:

定义最木棒的对象

class Item
{
public Item(int length, int count)
{
Length
= length;
Count
= count;
}
public int Length { get; set; }public int Count { get; set; }
}

然后定义我们要组装的木棒的长度,这里是21。 定义一个结果类

class Segment
{
public Segment()
{
Items
= new List<int>();
}
public List<int> Items { get; set; }public int Length
{
get { return Items.Sum(); }
}
public void RemoveLast()
{
Items.RemoveAt(Items.Count
- 1);
}
}

定义一个MaximumFirstPermutation 类 作为控制类

class MaximumFirstPermutation
{
public MaximumFirstPermutation()
{
Items
= new List<Item>();
}
private List<Item> backupItems;public List<Item> Items { get; private set; }public int SegmentLength { get; set; }public Segment[] Segments { get; private set; }/// <summary>
/// 将结果写入文件
/// </summary>
/// <param name="fileName"></param>
public void WriteToFile(string fileName)
{
StreamWriter writer
= new StreamWriter(fileName);

List

<int> allItems = new List<int>();foreach (Segment segment in Segments)
{
writer.WriteLine(
string.Concat(segment.Items.Select(i => i + " ")));
allItems.AddRange(segment.Items);
}

writer.WriteLine();
writer.WriteLine(

"---------------------------");foreach (Item backupItem in backupItems)
{
Item usedItewm
= Items.First(i => i.Length == backupItem.Length);
writer.WriteLine(
string.Format("{0}: total {1}, used {2}, remaining {3}", backupItem.Length, backupItem.Count, allItems.Count(i => i == backupItem.Length), backupItem.Count - allItems.Count(i => i == backupItem.Length)));
}

writer.WriteLine();
writer.WriteLine(

"---------------------------");

writer.WriteLine(

string.Format("total length: {0}, used {1}, remaining {2}", backupItems.Sum(i => i.Length * i.Count), allItems.Sum(), backupItems.Sum(i => i.Length * i.Count) - allItems.Sum()));

writer.Close();
}

public void Compute()
{
backupItems
= Items.Select(i => new Item(i.Length, i.Count)).ToList();

Items

= Items.OrderByDescending(i => i.Length).ToList();
List
<Segment> segments = new List<Segment>();while (true)
{

Segment segment

= GetSegment(SegmentLength);if (segment != null)
{
segments.Add(segment);
}
else
{
break;
}
}

Segments

= segments.ToArray();
}
/// <summary>
/// 拼装过程
/// </summary>
/// <param name="length"></param>
/// <returns></returns>
private Segment GetSegment(int length)
{
Segment segment
= new Segment();
Item exact
= Items.FirstOrDefault(i => i.Count > 0 && i.Length == length);if (exact != null)
{
exact.Count
--;
segment.Items.Add(exact.Length);
return segment;
}
foreach (Item item in Items.Where(i => i.Count > 0 && i.Length < length))
{
int count = 1;while (true)
{
item.Count
-= count;for (int i = 1; i <= count; i++)
{
segment.Items.Add(item.Length);
}
bool exceeded = segment.Length > length;if (!exceeded)
{
Segment remainingSegment
= GetSegment(length - item.Length);
if (remainingSegment != null)
{
segment.Items.AddRange(remainingSegment.Items);
return segment;
}
}

item.Count

+= count;for (int i = 1; i <= count; i++)
{
segment.RemoveLast();
}
if (exceeded)
{
break;
}

count

++;
}
}
if (segment.Length != length)
{
return null;
}
return segment;
}
}

program.cs main 函数

MaximumFirstPermutation per = new MaximumFirstPermutation() { SegmentLength = 21 };

per.Items.Add(

new Item(1, 100));
per.Items.Add(
new Item(2, 200));
per.Items.Add(
new Item(3, 90));
per.Items.Add(
new Item(4, 14));
per.Items.Add(
new Item(5, 25));
per.Items.Add(
new Item(6, 6));
per.Items.Add(
new Item(7, 20));
per.Items.Add(
new Item(8, 35));
per.Items.Add(
new Item(9, 15));
per.Items.Add(
new Item(10, 21));
per.Items.Add(
new Item(11, 22));
per.Items.Add(
new Item(12, 9));
per.Items.Add(
new Item(13, 16));
per.Items.Add(
new Item(14, 35));
per.Items.Add(
new Item(15, 39));
per.Items.Add(
new Item(16, 41));
per.Items.Add(
new Item(17, 29));
per.Items.Add(
new Item(18, 26));
per.Items.Add(
new Item(19, 18));
per.Items.Add(
new Item(20, 20));
per.Items.Add(
new Item(21, 35));

per.Compute();
per.WriteToFile(

@"e:\r1.txt");

这个样例数据执行出来之后是

total length: 6479, used 6468, remaining 11

total Segment:48