Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#计算美元面额_C#_Arrays_Algorithm - Fatal编程技术网

C#计算美元面额

C#计算美元面额,c#,arrays,algorithm,C#,Arrays,Algorithm,下面是一个代码,可以找到用4种不同的账单获得87张支票的全部方法。我想知道如何改变这一点,以获得最低金额的法案(4-20,1-5,2-1),而不是每一个单一的方式。任何帮助都将不胜感激 int target = 87; int[] dollarSizes = { 1, 5, 10, 20 }; int[] ways = new int[target+1]; ways[0] = 1; for (int i = 0; i < dollarSizes.Length; i++) { fo

下面是一个代码,可以找到用4种不同的账单获得87张支票的全部方法。我想知道如何改变这一点,以获得最低金额的法案(4-20,1-5,2-1),而不是每一个单一的方式。任何帮助都将不胜感激

int target = 87;
int[] dollarSizes = { 1, 5, 10, 20 };
int[] ways = new int[target+1];
ways[0] = 1;

for (int i = 0; i < dollarSizes.Length; i++) {
    for (int j = dollarSizes[i]; j <= target; j++) {
        ways[j] += ways[j - dollarSizes[i]];
    }
}
int目标=87;
int[]dollarSizes={1,5,10,20};
int[]方式=新int[target+1];
方法[0]=1;
for(int i=0;i对于(int j=dollarSizes[i];j首先使用最高的钞票进行计数。如果新的金额太大,请不要添加该钞票,然后转到下一个美元大小:

class Program
{
    static void Main(string[] args)
    {
        var target = 87;
        var current = 0;
        var dollarSizes = new[] { 1, 5, 10, 20 }.OrderByDescending(x => x); // just make sure they're descending.
        var bestWay = new List<int>();

        foreach (var dollarSize in dollarSizes)
        {
            while (current + dollarSize <= target)
            {
                current += dollarSize;
                bestWay.Add(dollarSize);
            }

            if (current == target)
                break;
        }

        foreach (var dollar in bestWay)
        {
            Console.Write("{0}, ", dollar);
        }

        Console.ReadLine();
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var目标=87;
无功电流=0;
var dollarSizes=new[]{1,5,10,20}.OrderByDescending(x=>x);//只需确保它们是降序的。
var bestWay=新列表();
foreach(变量dollarSize in dollarSizes)
{

while(current+dollarSize首先使用最高的钞票进行计数。如果新的金额太大,请不要添加该钞票,然后转到下一个美元大小:

class Program
{
    static void Main(string[] args)
    {
        var target = 87;
        var current = 0;
        var dollarSizes = new[] { 1, 5, 10, 20 }.OrderByDescending(x => x); // just make sure they're descending.
        var bestWay = new List<int>();

        foreach (var dollarSize in dollarSizes)
        {
            while (current + dollarSize <= target)
            {
                current += dollarSize;
                bestWay.Add(dollarSize);
            }

            if (current == target)
                break;
        }

        foreach (var dollar in bestWay)
        {
            Console.Write("{0}, ", dollar);
        }

        Console.ReadLine();
    }
}
类程序
{
静态void Main(字符串[]参数)
{
var目标=87;
无功电流=0;
var dollarSizes=new[]{1,5,10,20}.OrderByDescending(x=>x);//只需确保它们是降序的。
var bestWay=新列表();
foreach(变量dollarSize in dollarSizes)
{

而(current+dollarSize您真正想要跟踪的是到达目标的速度。因此,给定20,10,5,1面额,代码在psuedo中如下所示

int initial = 87;             initial  twenties  tens   fives   ones
int twenties = initial / 20;    87        4
initial = initial % 20;          7        4    
int tens = initial / 10;         7        4       0
initial = initial % 10;          7        4       0
int fives = initial / 5;         7        4       0       1
initial = initial % 5;           2        4       0       1
int ones = initial;              2        4       0       1       2

正如您所见,有很多重复的逻辑,因此可以从循环中输入(我们从最大值开始)。

您真正想要跟踪的是到达目标的速度。因此,给定20,10,5,1面额,代码在psuedo中如下所示

int initial = 87;             initial  twenties  tens   fives   ones
int twenties = initial / 20;    87        4
initial = initial % 20;          7        4    
int tens = initial / 10;         7        4       0
initial = initial % 10;          7        4       0
int fives = initial / 5;         7        4       0       1
initial = initial % 5;           2        4       0       1
int ones = initial;              2        4       0       1       2
正如您所看到的,有很多重复的逻辑,因此可以从循环(我们从最大值开始)进行反馈。

public static int MakeChange(int amount)
{
如果(金额<0)
抛出新ArgumentOutOfRangeException(“金额应大于0”);
int[]availableBills={20,10,5,1};
int[]availableBillCounts={0,0,0,0};
int迭代器=0;
int提醒=金额;
同时(提醒>0)
{
availableBillCounts[iterator]=提醒/availableBills[iterator];
提醒=金额%availableBills[迭代器];
迭代器++;
}
返回availableBillCounts.Sum();
}
公共静态整数MakeChange(整数金额)
{
如果(金额<0)
抛出新ArgumentOutOfRangeException(“金额应大于0”);
int[]availableBills={20,10,5,1};
int[]availableBillCounts={0,0,0,0};
int迭代器=0;
int提醒=金额;
同时(提醒>0)
{
availableBillCounts[iterator]=提醒/availableBills[iterator];
提醒=金额%availableBills[迭代器];
迭代器++;
}
返回availableBillCounts.Sum();
}


一种方法是跟踪一个数组中要达到87美元所需的账单数量。然后,您只需在该数组中查找最小的数字,这将是您所需的最小账单数量。家庭作业?似乎是我儿子的问题。另外,请注意,在req中有一个合法的2美元账单。@CadeRoux(我敢肯定,是的就像…教授给我的那些out@drachenstern在加伦、镰刀和克努特中,一切都会变得容易得多。一种方法是跟踪在一个数组中你必须使用多少账单才能达到87美元。然后,你只需在该数组中查找最小的数字,这将是你所需的最小账单数。家庭作业?似乎是som这是我儿子的问题。另外,请注意,有一张2美元的合法钞票。@CadeRoux,我肯定这是我的要求;)就像……教授给我的out@drachenstern在加伦、镰刀和克努特中,一切都会变得简单得多。我本来打算使用mod,但当我开始测试时,我完全忘记了。很棒的解决方案:)看起来这看起来像是家庭作业,我很高兴你没有给他们准确的答案…我建议将
initial
重命名为可能
remaining
。令人困惑的是,initial最终不再是初始值。
remaining
让问题更清楚。@Reddog我觉得给他循环太多了。我所做的一切都是eally确实使用了一个孩子应该知道的逻辑;)@drachenstein:相当糟糕:
87%20
7
,而不是
4
。我本来打算使用mod,但当我开始测试时,我完全忘记了。很棒的解决方案:)看起来这看起来像是家庭作业,我很高兴你没有给他们确切的答案……我建议改名g
initial
到可能
remaining
。令人困惑的是,initial最终不再是初始值。
remaining
让它更清晰。@Reddog我觉得给他循环太多了。我真正做的就是使用一个孩子应该知道的相同逻辑;)@drachenstein:相当糟糕:
87%20
是<代码>7
,而不是
4