- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一道看似简单的数学题。这是一个数组。
Array = { 1, 2, 3 }
需要上述数组元素的所有可能组合,使总和 = 5。
Solution: { 1, 1, 1, 1, 1 } { 1, 1, 1, 2 } { 1, 2, 2 } { 2, 3 } { 1, 1, 3 }
注意:您可以多次使用任何数组元素,前提是总和应为 5。
int weight = 5;
List<int> weights = new List<int>() { 1, 2 ,3};
void function1(int weight,List<int> weights, List<List<int>> combinationlist)
{
for (int i = 0; i < weights.Count; i++)
{
if (weight % weights[i] == 0)
{
int num = weight / weights[i];
List<int> mylist = new List<int>();
for (int j = 0; j < num; j++)
{
mylist.Add(weights[i]);
}
if (!combinationlist.Contains(mylist))
combinationlist.Add(mylist);
}
}
}
现在上面的函数生成了 {1,1,1,1,1} 解的简单组合。
void function2(int weight, List<int> weights, List<List<int>> combinationlist)
{
int i = weights.Count - 1;
Stack<int> mystack = new Stack<int>();
List<int> combinationarray = new List<int>();
foreach (var x in weights)
mystack.Push(x);
for (;i >= 0; i--)
{
if (weight <= weights[i])
mystack.Pop();
}
int remainder = 0;
if (weight % mystack.Peek() != 0)
remainder = weight % mystack.Peek();
int quotient = weight / mystack.Peek();
combine(combinationlist,combinationarray,mystack,quotient,remainder);
}
合并函数
void combine(List<List<int>>combinations,List<int>combination,Stack<int> mystack,int quotient, int remweight)
{
for (int i = 0; i < quotient; i++)
{
combination.Add(mystack.Peek());
}
if (remweight > 1)
remweight = remweight - mystack.Peek() * quotient;
else if (remweight == 0)
{
if (!combinations.Contains(combination))
combinations.Add(combination);
return;
}
else
return;
while (mystack.Peek() > remweight )
{
if (mystack.Count != 0)
mystack.Pop();
}
quotient = remweight / mystack.Peek();
combine(combinations, combination, mystack, quotient, remweight);
}
所有这些工作。我只能得到两个解决方案 {2,1,1,1} {1,1,1,1,1}。
最佳答案
我将在 python 中提供答案,因为它很好地说明了算法。 Python 几乎就像是此类问题的伪代码。
# curr: a temporary list that is used only for printing the result
# arr: the list of input values
# val: the number we want to sum to
# currval: the number used so far (that will be the maximum number used so far)
def recursive_combos(curr, arr, val, currval):
for item in arr:
if item < currval:
continue
if val - item < 0:
return
if val - item == 0:
print curr + [item]
continue
recursive_combos(curr + [item], arr, val - item, item)
return
def combos(arr, val):
recursive_combos([], sorted(arr), 5, min(arr) - 1)
combos([3, 1, 2], 5)
回答:
[1, 1, 1, 1, 1]
[1, 1, 1, 2]
[1, 1, 3]
[1, 2, 2]
[2, 3]
这是递归的基本说明,我认为代码大部分是不言自明的。
此解决方案中需要注意的关键事项是:
关于algorithm - 使用动态规划的所有可能组合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41750246/
降本手段一招鲜,增效方法吃遍天; 01 互联网行业里; 降本策略千奇百怪,手段却出奇一致;增效方法五花八门,手段更是花里胡哨; 对于企业来说;
有什么方法可以使用 angularjs 中的部分进行代码分组吗? 原因 --- 我的 Controller 包含太多代码。该 Controller 包含了多个方法和大量功能的代码,降低了代码的可读性。
不幸的是,我的数据库的数据模型必须改变,所以我正在寻找最轻松的方式来迁移我的数据。 此时情况如何: create table cargo{ id serial primary key, per
在 QTextEdit 对象中,假设我想知道字符在鼠标光标下的位置。 我会写... void MyQTextEditObject::mousePressEvent(QMouseEvent* mouse
是否可以在 C++ 中返回一个 return 语句或做一些具有类似功能的事情? 例如,如果代码中有几个函数将指针作为输入,并且每个函数都检查指针是否为 nullptr,这将很方便。如果它是一个 nul
我的 PC 上有一个控制台应用程序,它是 signalR 服务器。 我有一个 html 页面,它是互联网上的 signalR 客户端。但我尝试连接服务器,但我有一个错误的请求 400 错误。如果服务器
我想将应用程序作为后台进程运行。当点击应用程序图标时,它不会显示任何 View ,只会启动后台进程。 最佳答案 对于 iOS 这是不可能的,但是对于 android,react native 有 he
我知道有(昂贵的)框架可以让你在 VS C# 中编写 android 应用程序并将其编译为 android apk。 我也知道,可以在 VS 中编写 Java 应用程序(link)。 是否有可能,甚至
我在做: can :manage, :all if user.role == 'admin' can :approve, Anuncio do |anuncio| anuncio.try(:apr
我是一名优秀的程序员,十分优秀!