c++ - 最大数据包数

标签 c++ algorithm

有 r 个红球、g 个绿球和 b 个蓝球。此外,还有无限数量的数据包提供给您。每包只能装 3 个球,并且应包含至少 2 种不同颜色的球。求出最多可以填充多少个数据包?

这是我使用动态编程的方法,非常简单

    map<multiset<int>,int> store;

int packets(int r,int g,int b){
    if (r<0||g<0||b<0){
        return 0;
    }
    if (r==g&&g==b){
        return r;
    }
    if ((r+g==0)||(g+b==0)||(b+r==0)){
        return 0;
    }
    if (r==0&&b==0&&g==0){
        return 0;
    }
    multiset<int> key;
    key.insert(r);key.insert(g);key.insert(b);
    if (store.find(key)!=store.end()){
        return store[key];
    }
    int max_packets = packets(r-2,g-1,b)+1;
    max_packets = max(max_packets,packets(r-2,g-1,b)+1);
    max_packets = max(max_packets,packets(r-1,g-2,b)+1);
    max_packets = max(max_packets,packets(r-2,g,b-1)+1);
    max_packets = max(max_packets,packets(r-1,g,b-2)+1);
    max_packets = max(max_packets,packets(r,g-2,b-1)+1);
    max_packets = max(max_packets,packets(r,g-1,b-2)+1);
    max_packets = max(max_packets,packets(r-1,g-1,b-1)+1);
    store[key] = max_packets;
    return max_packets;
}

我的解决方案可能在逻辑上是正确的,但对于较大的 r、g 和 b 值来说肯定是低效的。我还确定了 r、g、b 与最大数据包的一些模式,但无法从逻辑上证明它们。 有人可以帮我实现他们的想法吗?
谢谢

最佳答案

不失一般性地假设 r ≥ g ≥ b 通过排列 颜色。答案最多是 ⌊(r+g+b)/3⌋ 因为每个数据包需要 3 球。答案最多是 g+b,因为每个数据包都需要一个绿球 或蓝色球。事实证明,答案等于最小值 这两个量(所以在没有假设的情况下, min((r+g+b)/3, r+g, r+b, g+b) 假设像 C++ 中那样截断除法)。

我们用一个蓝色球和两个红色或红色球组成 b 个包。 绿色有更多的球剩余,如果平局则各一个。后 这些数据包,令 r′ 为剩余红球的数量,g′ 为 剩余的绿球数量。如果 r′ > 2g′ 并且至少有 还剩下三个球,那么我们还不能使用任何绿球,并且 我们每个人都装了两个红球,从而达到了 g+b 的配额。 否则,我们用两个红球和一个绿球组成数据包 或者一个红球和两个绿球,这样就剩下三个以下 球,这意味着我们已经按照要求形成了 ⌊(r+g+b)/3⌋ 个数据包。

关于c++ - 最大数据包数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69606918/

相关文章:

algorithm - Scala:比较一个巨大列表中的所有元素

多边形相交区域的算法

algorithm - Google "Did you mean?"算法是如何工作的?

c++ - 从父类调用派生成员函数

c++ - 我可以在 system() 中使用两个字符串吗?

c++ - std::vector::iterator 是否可以合法地成为指针

c++ - 删除() vector 中的元素不起作用

c++ - 为什么我的代码在 Windows 7 上不会出现段错误?

java - Java 中类似斐波那契数列的非递归解决方案是什么?

algorithm - 在 3D 空间中反射矢量