如何解决在较小的约束下使用位掩码找到装箱问题的解决方案
我们有 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 举报,一经查实,本站将立刻删除。