Erenfried 于 2016.09.18 16:50 提问

//C#

using System;
using System.Collections.Generic;
using System.Linq;

namespace Calculation
{
public class Greedy
{
public string msg = "";
public string Fun(string str)
{
string res = "";
var money = Exchange(Convert.ToDecimal(str));
decimal sum = 0;
foreach (var single in money)
{
if (single.Value != 0)
{
sum += single.Key*single.Value;
string s = string.Format("{0}元---->{1}张; 共{2}元 \r\n", single.Key, single.Value, sum);
res += s;
}
}
return res + "\r\n" + sum + "-" + str + "=" + (sum - Convert.ToDecimal(str)) + "\r\n" + msg;
}
public Dictionary Money = new Dictionary();
public Dictionary SetInit(decimal a,int c)
{
//key表示钱，value表示钱的张数
return Money;
}
private Dictionary Exchange(decimal num)
{
//指针
int i = 0;
int count = 1;
Dictionary ResMoney = Money.OrderByDescending(o => o.Key).ToDictionary(o => o.Key, p => p.Value);

``````        while (true)
{
#region 获取当前面值，若指针超出则直接跳出
decimal tar;
decimal next;
if (i > ResMoney.Count)
{
//超出
msg = "i > ResMoney.Count";
break;
}
else
{
tar = ResMoney.Keys.ElementAt(i);  //取得面值
}
if (i > ResMoney.Count - 2)
{
next = 0;
}
else
{
next = ResMoney.Keys.ElementAt(i + 1);  //取得面值
}

#endregion

if (num > tar)
{
num = num - tar;
//当前面额是否用完
if (count < ResMoney[tar])
{
count++; //money的张数自增
}
else
{
i++; //就去取下一张面值
if (i == ResMoney.Count)
{
msg = "num > tar";
break;
}
ResMoney[tar] = count;
count = 1;
}
}
else if (num == tar)
{
//当余额等于当前面额时，count跳出  -4 -2 -9 -5
ResMoney[tar] = count;
msg = "num == tar";
break;
}
else if (next < num && num < tar && next != 0)
{
i++; //就去取下一张面额
if (i == ResMoney.Count)
{
msg = "next < num && num < tar && next != 0";
break;
}
ResMoney[tar] = 0;
}
else if (num == next && next != 0)
{
if (tar == next)
{
//余额等于最小面额，count跳出
ResMoney[tar] = count;
msg = "num == next && next != 0;tar == next";
break;
}
else
{
i++; //就去取下一张面额
if (i == ResMoney.Count)
{
msg = "num == next && next != 0";
break;
}
ResMoney[tar] = 0;
}
}
else if (num < next && next != 0)
{
//余额小于最小面额，跳出 -2 -1
ResMoney[tar] = count;
msg = "num < next && next != 0";
break;
}
else if (next==0)
{
//余额小于最小面额，跳出  -2 -7
ResMoney[tar] = count;
msg = "next==0";
break;
}
}

if (i < ResMoney.Count)
{
i++;
for (;i<ResMoney.Count;i++)
{
decimal max = ResMoney.Keys.ElementAt(i);  //取得面值
ResMoney[max] = 0;
}
return ResMoney;
}
else
{
return ResMoney;
}

}
}
``````

}

1个回答

caozhy      2016.09.18 17:25

/* 问题:拦截导弹。导弹系统有缺陷，后面炮弹高度<=前一发高度。计算系统能拦截多少导弹。拦截时，必须按照时间顺序，不允许先拦截后面的导弹再拦截前面的导弹。 输入:每组输入两行。第一行:导弹数量k(k<=25)。第二行:k个整数，表示第k枚导弹的高度，按时间顺序，空格分隔 输出:每组输出一行，包含一个整数，表示能拦截多少导弹。 输入: 8 300 207 155 300 299 170 158 6

/**  * 金额越大 概率越小  金额越小概率越大  建议 min 和 max 的值不能相差  10以上，相差越大， 计算量越大越慢      * \$pow 默认1.6 值越大 取值 1.1 到 2.0， 则分的越散 则 大金额概率越小 ，值越小  则 分的越密集 效果越差  运算越快  越大  运算量越大  * @param int \$min 最小金额  * @param int \$m
java组合算法应用：购物满减（任意数字组合相加在某个范围内）

js或者php简单实现购买产品满1年优惠2个月的算法

<?php /** * @param int \$no_of_codes//定义生成优惠码个个数 * @param array \$exclude_codes_array//老优惠券组 * @param int \$code_length//优惠码的长度 * @return array //返回数组 */ function generate_promotion_code(\$no_of_code

Mapreduce 是谷歌提出的一个分布式计算框架， 利用该框架， 能够让用户方便地利用多机并行处理数据。 该框架有两个重要的函数： Map 和 Reduce， Map 函数对整个输入数据进行处理， 按照用户定义的处理方式， 从输入的数据中产生中间键值对（ key， value）。Reduce 函数对这些键值对进行处理， 相同 key 的键值