给出的是三个容器具有不同容量(以升):分布的水在三个容器
答:11
B:8
C:5
的问题是如何许多可能性在那里分配13升对他们? 我试图通过列举他们所有的系统性蛮力,并得出了51种可能性的结果。
有没有蛮力的另一种方式?而且我的解决方案是否正确?
在此先感谢! :d
给出的是三个容器具有不同容量(以升):分布的水在三个容器
答:11
B:8
C:5
的问题是如何许多可能性在那里分配13升对他们? 我试图通过列举他们所有的系统性蛮力,并得出了51种可能性的结果。
有没有蛮力的另一种方式?而且我的解决方案是否正确?
在此先感谢! :d
你可以尝试这样的:
结合可以实现这个作为一个简单的递归算法(这里用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))
该算法也可用于三个以上的容器。不过,这可以变得更有效率。您可以使用某种形式的记忆或动态编程来减少重复计算,但对于三个容器无关紧要。
(当然,这假定水只能被划分成一升的倍数。)
假设,
的想法是回溯
存储在list
容器的容量。
由于没有指定语言标记,我会用C++语言给我。组合的总数存在于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);
}
}
集装箱[5, 8, 11]
和总容量= 13的输出将是1。 我。E)采用[5, 8]
如果容器可以使用多个时间再改
fillJug(list,i + 1,cap - list[i], newtemp);
到
fillJug(list,i,cap - list[i], newtemp);
你是什么意思与 “暴力” 吗?尝试所有可能的三个容器的填充,看看他们哪些加起来13? –
是的,这是我的尝试。 – GionSnow
这个问题太小了,以至于无法想出更智能的解决方案。只需使用两个嵌套循环并尝试各种可能性。 – Henry