C# 将一个整数表示为其他一些固定整数的和

C# 将一个整数表示为其他一些固定整数的和,c#,.net,algorithm,C#,.net,Algorithm,我有一个固定的权重列表: int[] weights = new int[] { 10, 15, 20 }; 目标是: int target = 28; 我正在寻找一种算法,将目标表示为权重(允许重复)中的元素之和,以便匹配或超过目标,实现与目标最接近的匹配,并且在该算法中,所用权重的数量最小化 因此,对于上述输入,我希望返回1020或1515,因为30是我们能得到的最接近的,而且在制作30的选项中,这两个选项比1010更好 如果目标为39,则输出应为20,而不是15 10或10 当目标为1

我有一个固定的权重列表:

int[] weights = new int[] { 10, 15, 20 };
目标是:

int target = 28;
我正在寻找一种算法,将
目标
表示为
权重
(允许重复)中的元素之和,以便匹配或超过
目标
,实现与
目标
最接近的匹配,并且在该算法中,所用权重的数量最小化

因此,对于上述输入,我希望返回
1020
1515
,因为
30
是我们能得到的最接近的,而且在制作
30
的选项中,这两个选项比
1010
更好

如果
目标
39
,则输出应为
20
,而不是
15 10
10

目标
14
时,输出应为
15

除了常规的foreach循环之外,这里还有好的方法吗?我正在考虑重新获取数组中可用的最大值,并检查目标值是否为负值,如果不是,那么让我们继续下一个值

这不是家庭作业:)

这被称为家庭作业。唯一的区别是,您正在寻找最近的匹配,而不是最近的较低匹配。同样幸运的是,没有一个权重具有不同的值。困难在于,您不能简单地使用最接近的
权重之一,并使用剩余值递归(较小值的组合有时会更好地匹配)


在您的示例中,
权重
之间都有5个“单位”,如果总是这样,问题将变得更容易解决

多亏了这里的每个人,我终于找到了一个解决方案,这让我更清楚地知道我真正需要什么。这不是我写过的最漂亮的代码,但无论如何,这是MVP开发

private static List<int> WeightsJuggle(List<int> packages, IOrderedEnumerable<int> weights, int weight)
{
    if (weight == 0)
        return packages;

    foreach (int i in weights.Where(i => i >= weight))
    {
        packages.Add(i);
        return packages;
    }

    packages.Add(weights.Max());
    return WeightsJuggle(packages, weights, weight - weights.Max());
}
私有静态列表权重juggle(列表包、IOrderedEnumerable权重、int-weight)
{
如果(权重==0)
退货包裹;
foreach(权重中的int i,其中(i=>i>=weight))
{
增加(i);
退货包裹;
}
packages.Add(weights.Max());
返回WeightsJuggle(packages,weights,weight-weights.Max());
}
我这样称呼它

IOrderedEnumerable<int> weights = new int[] { 10, 15, 20 }.OrderBy(x => x);
int weight = 65;
List<int> packages = new List<int>();
IOrderedEnumerable weights=newint[]{10,15,20}.OrderBy(x=>x);
整数重量=65;
列表包=新列表();
重量为65的测试

重量为123的测试


我不理解“如果我的权重为39,结果将是20和20”。数组中只有一个20。因此,您可以从数组中多次选择相同的值,并希望所选值的总和大于或等于目标值。想必,您想要的是尽可能低的总和,同时也要最小化所选值的数量?例如,当目标=28?15,15对28和20,10同样有效时,10,10是一个更糟糕的选择is@TimSchmelter-我在第一个问题中讨论了这一组合-除了其他限制之外,我们是否在寻求最小化所做选择的数量?每个人:我已经重写了,以将这里讨论的所有内容都包含在评论中@Trikks请检查我没有改变问题无法正常工作。用
weight=30试一试。结果将是
20,15
,但它应该是
20,10
15,15