using System;
using System.Collections.Generic;
using System.Linq;
using System.Text; namespace Knapsack
{
/// <summary>
/// Project:Knapsack
/// Author: Andy Zeng
/// Email:andyzengsh@gmail.com
/// Date:2014/04/12
/// </summary>
class Program
{
static void Main(string[] args)
{
InitStates();
int totalNumber = (States.Sum(s => s.TicketCount));
if (totalNumber % == )
Console.WriteLine("No Possible to Equal!");
int[,] Best = new int[States.Length + , totalNumber / + ];
Console.WriteLine("Target is {0}.", totalNumber / );
for (int i = ; i <= States.Length - ; i++)//
{
for (int j = ; j <= totalNumber / ; j++)
{
if (j < States[i].TicketVolume)
{
Best[i, j] = Best[i - , j];
}
else
{
int tmp = Best[i - , j - States[i].TicketVolume] + States[i].TicketCount;
int tmp2 = Best[i - , j];
Best[i, j] = Math.Max(tmp, tmp2);
}
}
}
Console.WriteLine("The best result for target {0} is {1}.", totalNumber / , Best[States.Length - , totalNumber / ]); List<State> tmpStates = new List<State>(); int lastMax = States.Length - ;
int lastTarget = totalNumber / ;
while (lastMax > && lastTarget > && Best[lastMax, lastTarget] > )
{
int currentMax = lastMax;
for (int i = lastMax; i > ; i--)
{
if (Best[i, lastTarget] >= Best[lastMax, lastTarget])
{ currentMax = i; }
} if (lastMax >= currentMax)
{
tmpStates.Add(States[currentMax]);
lastMax = currentMax;
lastTarget = lastTarget - States[currentMax].TicketCount;
lastMax--;
}
else
{
tmpStates.Add(States[lastMax]);
lastTarget = lastTarget - States[lastMax].TicketVolume;
lastMax--;
}
} tmpStates.ForEach(s => { Console.WriteLine(s); });
Console.WriteLine("TotalTickets:{0}", tmpStates.Sum(s => s.TicketCount)); Console.ReadKey();
} //Remember:i And v are both dynamic values.
//F(i,v)=f(i-1,v) ,At this condition ,the number i thing's volume is biggger than the v
//or
//F(i,v)=Max{F(i-1,v),F(i-1,v-C(i))+W(i)},pick the biggest/best result private static State[] States;
private static void InitStates()
{
var states = baseData.Split(',');
States = new State[states.Length + ];
States[] = new State() { Name = string.Empty, TicketCount = };
for (int i = ; i <= states.Length; i++)
{
var tmpStrings = states[i - ].Split(':');
States[i] = new State() { Name = tmpStrings[].Trim(), TicketCount = int.Parse(tmpStrings[]) };
}
}
#region baseData
private const string
baseData = @"
阿拉巴马州:9,
阿拉斯加州:3,
亚利桑那州:10,
阿肯色州:6,
加利福尼亚州:55,
科罗拉多州:9,
康涅狄格州:7,
特拉华州:3,
哥伦比亚特区:3,
佛罗里达州:27,
乔治亚州:15,
夏威夷州:4,
爱达荷州:4,
伊利诺伊州:21,
印第安那州:11,
艾奥瓦州:7,
堪萨斯州:6,
肯塔基州:8,
路易斯安那州:9,
缅因州:4,
马里兰州:10,
马萨诸塞州:12,
密歇根州:17,
明尼苏达州:10,
密西西比州:6,
密苏里州:11,
蒙达拿州:3,
内布拉斯加州:5,
内华达州:5,
新罕布什尔州:4,
新泽西州:15,
新墨西哥州:5,
纽约州:31,
北卡罗来纳州:15,
北达科他州:3,
俄亥俄州:20,
俄克拉荷马州:7,
俄勒岗州:7,
宾夕法尼亚州:21,
罗德岛州:4,
南卡罗来纳州:8,
南达科达州:3,
田纳西州:11,
德克萨斯州:34,
犹他州:5,
蒙大拿州:3,
维吉尼亚州:13,
华盛顿州:11,
西维吉尼亚州:5,
威斯康辛州:10,
怀俄明州:3";
#endregion
}
class State
{
public string Name { get; set; }
public int TicketCount { get; set; }
//In this issue , the Volume property is to simulate the Volume property from the Package Algorithm.
public int TicketVolume { get { return TicketCount; } }
public override string ToString()
{
return string.Format("{0}:{1}", Name, TicketCount);
}
}
}

运行结果:

下载源码

作者:Andy Zeng
欢迎任何形式的转载,但请务必注明出处。

http://www.cnblogs.com/andyzeng/p/3670397.html

美国选举问题/完全背包/Knapsack的更多相关文章

  1. Siki_Unity_3-3_背包系统

    Unity 3-3 背包系统(基于UGUI) 任务1&2&3:演示.介绍.类图分析 背包面板.箱子面板.锻造合成面板.装备佩戴面板.商店面板等 面板的显示和隐藏.保存和加载.拾起物品. ...

  2. 杂项:大数据 (巨量数据集合(IT行业术语))

    ylbtech-杂项:大数据 (巨量数据集合(IT行业术语)) 大数据(big data),指无法在一定时间范围内用常规软件工具进行捕捉.管理和处理的数据集合,是需要新处理模式才能具有更强的决策力.洞 ...

  3. NP完全问题的证明

    目录 NP完全问题的证明 一.限制法 最小覆盖问题(VC) 子图同构问题 0-1背包(Knapsack) 三元集合的恰当覆盖(X3C) 集中集 有界度的生成树 多处理机调度 二.局部替换法 3SAT问 ...

  4. FOJProblem 2214 Knapsack problem(01背包+变性思维)

    http://acm.fzu.edu.cn/problem.php?pid=2214 Accept: 4    Submit: 6Time Limit: 3000 mSec    Memory Lim ...

  5. FZU 2214 Knapsack problem 01背包变形

    题目链接:Knapsack problem 大意:给出T组测试数据,每组给出n个物品和最大容量w.然后依次给出n个物品的价值和体积. 问,最多能盛的物品价值和是多少? 思路:01背包变形,因为w太大, ...

  6. Atcoder E - Knapsack 2 (01背包进阶版 ex )

    E - Knapsack 2 Time Limit: 2 sec / Memory Limit: 1024 MB Score : 100100 points Problem Statement The ...

  7. FZU 2214 ——Knapsack problem——————【01背包的超大背包】

    2214 Knapsack problem Accept: 6    Submit: 9Time Limit: 3000 mSec    Memory Limit : 32768 KB  Proble ...

  8. FZU - 2214 Knapsack problem 01背包逆思维

    Knapsack problem Given a set of n items, each with a weight w[i] and a value v[i], determine a way t ...

  9. (01背包 当容量特别大的时候) Knapsack problem (fzu 2214)

    http://acm.fzu.edu.cn/problem.php?pid=2214   Problem Description Given a set of n items, each with a ...

随机推荐

  1. 实现Bidirectional LSTM Classifier----深度学习RNN

    双向循环神经网络(Bidirectional Recurrent Neural Networks,Bi-RNN),Schuster.Paliwal,1997年首次提出,和LSTM同年.Bi-RNN,增 ...

  2. SGU 176 Flow construction(有源汇上下界最小流)

    Description 176. Flow construction time limit per test: 1 sec. memory limit per test: 4096 KB input: ...

  3. 科普:PCI-E插槽都有哪些样子?

    主板上的扩展插槽曾经是多种多样的,例如曾经非常流行的组合就是PCI插槽搭配AGP插槽,其中AGP插槽主要用在显卡上,而PCI插槽的用途则更广一些,不仅有用在显卡上,还能用于扩展其它设备,如网卡.声卡. ...

  4. Python运行的方式

    Python的运行方式多种多样,下面列举几种: 交互式 在命令行中输入python,然后在>>>提示符后面输入Python语句,这里需要注意: 1 语句前面不能有空格,否则会报错 2 ...

  5. Java常用类之StringBuffer

    StringBuffer 类: 1. java.lang.StringBuffer 代表可变的字符序列: 2. StringBuffer 和 String 类似,但是 StringBuffer 可以对 ...

  6. 关闭win7/Server 2008非正常关机启动自动修复功能

    命令提示符下输入 bcdedit /set {default} bootstatuspolicy ignoreallfailures bcdedit /set {current} recoveryen ...

  7. WPF对某控件添加右键属性

    代码创建右键属性 ContextMenu cm = new ContextMenu(); MenuItem mi = new MenuItem(); mi.Header = "打开此文件所有 ...

  8. html5 isPointInPath相关操作

    <body> <canvas id="> </canvas> <script type="text/javascript"> ...

  9. 【刷题】BZOJ 1003 [ZJOI2006]物流运输

    Description 物流公司要把一批货物从码头A运到码头B.由于货物量比较大,需要n天才能运完.货物运输过程中一般要转停好几个码头.物流公司通常会设计一条固定的运输路线,以便对整个运输过程实施严格 ...

  10. bzoj 1207: [HNOI2004]打鼹鼠 (dp)

    var n,m,i,j,ans:longint; x,y,time,f:..]of longint; begin readln(n,m); to m do readln(time[i],x[i],y[ ...