题意:
有
n
件
货
物
,
第
i
件
重
w
i
吨
有 n 件货物, 第 i 件重 w_i 吨
有n件货物,第i件重wi吨
另
有
x
个
集
装
箱
,
每
个
集
装
箱
可
以
装
重
量
不
超
过
W
吨
的
货
物
。
另有 x 个集装箱,每个集装箱可以装重量不超过 W 吨的货物。
另有x个集装箱,每个集装箱可以装重量不超过W吨的货物。
货
物
不
能
拆
分
,
问
能
否
装
下
货物不能拆分,问能否装下
货物不能拆分,问能否装下
题解:
n
<
=
20
,
x
,
w
<
=
1
e
9
n<=20,x,w<=1e9
n<=20,x,w<=1e9
所
以
直
接
考
虑
暴
力
搜
索
所以直接考虑暴力搜索
所以直接考虑暴力搜索
用
d
f
s
搜
索
对
于
每
个
货
物
和
哪
个
集
合
装
在
一
起
可
以
用
一
个
集
装
箱
用dfs搜索对于每个货物和哪个集合装在一起可以用一个集装箱
用dfs搜索对于每个货物和哪个集合装在一起可以用一个集装箱
所
以
直
接
对
每
个
货
物
能
放
的
盒
子
进
行
搜
索
所以直接对每个货物能放的盒子进行搜索
所以直接对每个货物能放的盒子进行搜索
因
为
盒
子
数
为
m
i
n
(
x
,
n
)
,
不
会
比
这
个
更
多
了
因为盒子数为min(x,n),不会比这个更多了
因为盒子数为min(x,n),不会比这个更多了
所
以
盒
子
数
最
大
为
20
,
就
可
以
进
行
暴
力
枚
举
盒
子
的
摆
放
所以盒子数最大为20,就可以进行暴力枚举盒子的摆放
所以盒子数最大为20,就可以进行暴力枚举盒子的摆放
是
一
个
3
n
算
法
,
经
过
不
能
放
时
候
的
可
行
性
剪
枝
是一个3^n算法,经过不能放时候的可行性剪枝
是一个3n算法,经过不能放时候的可行性剪枝
最
终
可
以
完
成
d
f
s
,
只
要
统
计
全
部
能
放
最终可以完成dfs,只要统计全部能放
最终可以完成dfs,只要统计全部能放
说
明
可
以
装
下
,
否
则
不
能
说明可以装下,否则不能
说明可以装下,否则不能
AC代码
/*
Author : zzugzx
Lang : C++
Blog : blog.csdn.net/qq_43756519
*/
#include<bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define endl '\n'
#define SZ(x) (int)x.size()
#define mem(a, b) memset(a, b, sizeof(a))
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const int mod = 1e9 + 7;
//const int mod = 998244353;
const double eps = 1e-6;
const double pi = acos(-1.0);
const int maxn = 1e6 + 10;
const int N = 1e2 + 5;
const ll inf = 0x3f3f3f3f;
const ll oo = 8e18;
const int dir[][2]={{0, 1}, {1, 0}, {0, -1}, {-1, 0}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}};
ll b[25], a[25];
int n, x, w;
bool dfs(int now) {
if (now == n + 1) return 1;
for (int i = 1; i <= min(x, now); i++) {
if (b[i] + a[now] > w) continue;
b[i] += a[now];
if (dfs(now + 1)) return 1;
b[i] -= a[now];
}
return 0;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0); cout.tie(0);
// freopen("in.txt", "r", stdin);
// freopen("out.txt", "w", stdout);
int _;
cin >> _;
while (_--) {
mem(b, 0);
cin >> n >> x >> w;
for (int i = 1; i <= n; i++)
cin >> a[i];
if (dfs(1)) cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}