题意:
有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;
}