您的位置:首页 > 其它

ZSTU校赛Problem D: 买iphone(背包)

2017-03-19 17:22 330 查看


Problem D: 买iphone

Time Limit: 3 Sec  Memory Limit: 128 MB
Submit: 825  Solved: 121


Description

自从上次仓鼠中了1000万彩票后,彻底变成了土豪了,一群人愿意认他做干爹,仓鼠决定送他的干儿子每人一部iphone。仓鼠今天带了一群人去买iphone,每个人身上都背着一个大背包,只有3种背包,分别能装a,b,c个iphone,仓鼠希望每个人都能用iphone装满自己的背包。仓鼠有n个干儿子,也就是要买n部手机,仓鼠带了k个人去买手机,问是否存在一种情况能让每个买iphone的人的背包都装满


Input

输入包含多组测试数据,每组一行,包含5个整数n, k, a, b, c
(1 <= n, k , a, b, c <= 10000)
abc可以相同


Output

如果存在输出Yes,否则输出No


Sample Input

10 3 3 3 4
20 7 1 1 1
80 3 100 3 3
15 4 3 5 6



Sample Output

Yes
No
No
Yes



HINT

样例一3个人分别带大小为 3 3 4的背包去买手机正好每个人都装满

样例二 很明显只有一种背包,全部都是1也无法买20部iphone

样例四 4个人分别带大小为 3 3 3 6的背包去买手机正好每个人都装满

思路:bitset水过。

# include <iostream>
# include <cstdio>
# include <cstring>
# include <algorithm>
# include <vector>
# include <bitset>
# include <cmath>
# include <cstdlib>
# define INF 0x3f3f3f3f
# define LL long long
using namespace std;
bitset<10005>dp, pd;
int main()
{
int n, k, a, b, c;
while(~scanf("%d%d%d%d%d",&n,&k,&a,&b,&c))
{
dp.reset();
dp[0] = 1;
int imin = min(a, min(b, c));
int imax = max(a, max(b, c));
if(k*imin > n || k*imax < n)
{
puts("No");
continue;
}
for(int i=1; i<=k; ++i)
{
swap(dp, pd);
dp.reset();
dp |= pd << a;
dp |= pd << b;
dp |= pd << c;
}
if(dp
)
puts("Yes");
else
puts("No");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: