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
。