NC200532. 装货物
描述
输入描述
第一行一个整数 T ,表示数据组数。对于每组数据:第一行三个整数 。第二行 n 个整数,第 i 个表示 。保证 , 的数据不会超过 2 组。
输出描述
对于每组数据输出一行一个字符串,能装下所有货物输出 Yes ,否则输出 No 。
示例1
输入:
2 5 2 20 2 4 6 8 10 1 114514 1919810 114514
输出:
Yes Yes
说明:
第一组数据的一种可能方案:{4,6}, {2,8,10}C++14(g++5.4) 解法, 执行用时: 322ms, 内存消耗: 504K, 提交时间: 2020-08-20 09:00:09
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=100; int n,c; ll w; ll a[maxn],b[maxn]; bool dfs(int u) { if(u==n) return true; for(int i=0;i<min(c,u+1);i++) { if(b[i]+a[u]<=w) { b[i]+=a[u]; if(dfs(u+1)) return true; b[i]-=a[u]; } } return false; } void solve() { cin>>n>>c>>w; memset(b,0,sizeof(b)); for(int i=0;i<n;i++) cin>>a[i]; if(dfs(0)) puts("Yes"); else puts("No"); } int main() { int t; cin>>t; while(t--) solve(); return 0; }
C++ 解法, 执行用时: 366ms, 内存消耗: 436K, 提交时间: 2022-07-26 19:57:04
#include<bits/stdc++.h> using namespace std; const int maxn=25; int n,T,x,w,a[maxn],b[maxn]; bool dfs(int now) { if(now==n+1) return true; 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 true; b[i]-=a[now]; } return false; } int main() { cin>>T; while(T--) { memset(b,0,sizeof(b)); cin>>n>>x>>w; for(int i=1;i<=n;i++) cin>>a[i]; cout<<(dfs(1)?"Yes":"No")<<endl; } }