在3个容器中分配水

时间:2017-10-04 09:15:40

标签: algorithm backtracking

鉴于三个容器具有不同容量(以升为单位):

A:11

B:8

C:5

问题是有多少人可以向他们分发13升? 我通过系统地列出它们来尝试蛮力,并且已经产生了51种可能性。

有没有其他方式没有蛮力?我的解决方案也是正确的吗?

提前致谢! :d

2 个答案:

答案 0 :(得分:0)

假设,

  1. 单个容器只能使用一次。
  2. 只能完全填充容器。
  3. 想法是回溯

    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升的倍数。)