Description
有 n 件货物, 第 i 件重 吨,另有 x 个集装箱,每个集装箱可以装重量不超过 W 吨的货物。
货物不能分拆,请判断这 x 个集装箱能否装下所有货物。
Solution
, 考虑搜索,由于货物不能拆分,于是我们所需要的集装箱最多需要 个,那么我们可以预处理出 个容量为 的桶,然后每次搜索能否放到该桶里面,最后回溯。
注意这道题还需要一些剪枝技巧,详情看代码。
Code
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N = 23 + 5; int a[N], table[N], n, x, w; bool flag; void dfs(int now) { if(flag) return ; if(now == n + 1) { flag = 1; return ; } int in = 0; for(int i = 1; i <= min(now, x); i++) { // 如果是min(now,x)会TLE if(table[i] >= a[now]) { table[i] -= a[now]; dfs(now + 1); if(flag) return ; table[i] += a[now]; in = 1; } } if(!in) return ; } int main() { ios::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr); int T; cin >> T; while(T--) { cin >> n >> x >> w; for(int i = 1; i <= n; i++) cin >> a[i]; sort(a + 1, a + 1 + n, greater<int>()); flag = false; for(int i = 1; i <= n; i++) table[i] = w; dfs(1); if(flag) { cout << "Yes\n"; } else { cout << "No\n"; } } return 0; }