P3052 [USACO12MAR]Cows in a Skyscraper G
P3052 [USACO12MAR]Cows in a Skyscraper G
题意:给出n个物品,体积为w[i],现把其分成若干组,要求每组总体积 ≤ W,问最小分组。(\(n ≤ 18\))
解题思路:数位DP,记录每一头牛放到哪一个电梯中,l数组表示剩余的体积,\(f[i]\)表示当状态下的最有放置,那么答案就是\(f[(1 << n) - 1]\)
解题代码:
#include <bits/stdc++.h>
#define pii pair<int,int>
#define endl '\n'
using namespace std;
#define int long long
const int maxn = 1e6 + 5;
const int MOD = 1e9 + 7;
int f[maxn];
int l[maxn];
int c[maxn];
signed main() {
int n,w;
cin >> n >> w;
for(int i = 0;i<n;i++)cin >> c[i];
int ri = (1 << n);
memset(f,0x7f,sizeof f);
f[0] = 1;
l[0] = w;
for(int i = 0;i < ri;i++){
for(int j = 0;j < n;j++){
if(i & (1 << j))continue;
if(l[i] >= c[j]){
if(f[i] <= f[i|(1 << j)]){
f[i|(1 << j)] = f[i];
l[i|(1 << j)] = max(l[i|(1 << j)],l[i] - c[j]);
}
}else{
if(f[i] + 1 <= f[i|(1 << j)]){
f[i|(1 << j)] = f[i] + 1;
l[i|(1 << j)] = max(l[i|(1 << j)],w - c[j]);
}
}
}
}
cout << f[ri - 1] << endl;
system("pause");
return 0;
}

浙公网安备 33010602011771号