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