鉴于三个容器具有不同容量(以升为单位):
A:11
B:8
C:5
问题是有多少人可以向他们分发13升? 我通过系统地列出它们来尝试蛮力,并且已经产生了51种可能性。
有没有其他方式没有蛮力?我的解决方案也是正确的吗?
提前致谢! :d
答案 0 :(得分:0)
假设,
想法是回溯
session.read
中存储的容器容量。
由于没有指定语言标签,我将用C ++给我。 InputStream ffStream = session.read(flowFile);
...do something with stream
ffStream.close();
变量中存在组合总数,并且list
使用的answer
存储为containers
变量中的列表列表。
result
表示容器int answer = 0;
vector<vector<int>> result;
void fillJug(vector<int> list, int index, int cap, vector<int> temp)
{
if(cap == 0)
{
++answer;
result.push_back(temp);
return;
}
if(cap < list[index])
{
return;
}
for(int i= index; i < list.size(); ++i)
{
vector<int> newtemp(temp);
newtemp.push_back(list[i]);
fillJug(list,i + 1,cap - list[i], newtemp);
}
}
,总容量= 13.输出为1。
即使用[5, 8, 11]
如果容器可以多次使用,则更改
[5, 8]
到
fillJug(list,i + 1,cap - list[i], newtemp);
答案 1 :(得分:-1)
您可以尝试这样:
您可以将其实现为一个简单的递归算法(在Python中):
def divide(liters, containers):
if len(containers) == 1 and containers[0] >= liters:
yield [liters]
elif len(containers) >= 2 and liters <= sum(containers):
first, *rest = containers
for x in range(0, min(liters, first) + 1):
for remaining in divide(liters - x, rest):
yield [x] + remaining
result = list(divide(13, [11, 8, 5]))
print(len(result))
此算法也可用于三个以上的容器。但是,这可以提高效率。您可以使用某种形式的memoization或动态编程来减少重复计算,但对于三个容器并不重要。
(当然,这假设水只能分为1升的倍数。)