题意:
有n件货物,每件货物有一个重量,我们有x个承重为w的箱子,求是否能全部装上?
思路:
dfs暴搜:
先将货物重量从大到小排序,这样可以降低解空间。
dfs时箱子使用个数不超过当前物品数,因为超过没有意义。
代码:
#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
const ll inf=1000000007;
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9')
{
if(ch=='-')
f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9')
{
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int a[105], p, xi[30], n, wi, x;
int dfs(int v)
{
if(v==n)
{
return 1;
}
for(int i=0; i<=v&&i<p; i++)
{
if(xi[i]>=a[v])
{
xi[i]-=a[v];
if(dfs(v+1))
{
return 1;
}
xi[i]+=a[v];
}
}
return 0;
}
int main()
{
int t;
t=read();
while(t--)
{
n=read();
x=read();
wi=read();
p=min(n,x);
fill(xi,xi+p,wi);
for(int i=0; i<n; i++)
{
a[i]=read();
}
sort(a,a+n,greater<int>());
if(dfs(0))
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}

京公网安备 11010502036488号