列表

详情


NC200532. 装货物

描述

有 n 件货物, 第 i 件重 w_i 吨,另有 x 个集装箱,每个集装箱可以装重量不超过 W 吨的货物。
货物不能分拆,请判断这 x 个集装箱能否装下所有货物。

输入描述

第一行一个整数 T ,表示数据组数。
对于每组数据:
第一行三个整数  。
第二行 n 个整数,第 i 个表示 w_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;
	}
}

上一题