微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在较小的约束下使用位掩码找到装箱问题的解决方案

如何解决在较小的约束下使用位掩码找到装箱问题的解决方案

我们有 n 个盒子和一个权重数组,其中第 i 个盒子的权重由 arr[i] 给出。我们有一个容器,它可以承载的最大重量为 w。现在我们必须找到包装这 N 件物品所需的最少容器数。

确切的问题链接:- https://www.hackerrank.com/contests/coding-round-practice/challenges/michaels-worries

有用的资源:- https://www.geeksforgeeks.org/bin-packing-problem-minimize-number-of-used-bins/

如果约束很小,我们可以使用带有位掩码的动态编程来解决这个问题。这是我为实现相同而编写的代码。但是,它超出了时间限制。

约束:

1

1

0

int get_minimum_parcels(int n,int w,vector<int> arr) {
    //stores the weight of Boxes for every possible combination
    vector<int> sums(1<<n); 
    for(int i=0;i<(1<<n);i++){
        for(int j=0;j<n;j++){
            if(i & (1<<j)){
                sums[i]+=arr[j];
            }
        }
    }
    
    // dp[i][j] denotes whether it is possible to distribute
    // the Boxes as mentioned in the j bitmask to i containers 
    vector<vector<bool> > dp(21,vector<bool> (1<<n));

    // Initialising for 1 container
    for(int i=0;i<(1<<n);i++){
        if(sums[i]<=w){
            dp[1][i]=true;
        } else{
            dp[1][i]=false;
        }
    }
    
    // The maximum answer n is always possible,// Thus checking from 2 to n to find the min possible answer 
    for(int i=2;i<=n;i++){
        for(int j=1;j<(1<<n);j++){
            dp[i][j] = dp[i-1][j];
            // Enumerating the submasks
            for(int k=j;k;k = (k-1) & j){
                dp[i][j] = dp[i][j] | (sums[k]<=w && dp[i-1][j-k]);
            }
        }
    }

    for(int i=1;i<=n;i++){
        if(dp[i][(1<<n)-1])
           return i;
    }

    return n;
}

我们可以优化这个解决方案吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?