4269: 买iphone
Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 1849 Solved: 345
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的背包去买手机正好每个人都装满
思路:
枚举最大背包使用的数量i.
对于剩余的需要容量yu=n-i*最大容量背包;
对于剩余的需要的背包个数contz=k-i
那么对于剩下的两种背包,如果其差值可以被yu-contz*最小容量背包整除,并且保证contz*最小容量背包<=yu&&contz*第二大容量背包>=yu;
那么结果就是Yes.
过程维护是否有可行解即可。
Ac代码:
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[5];
int gcd(int x,int y)
{
if(x%y==0)return y;
else return gcd(y,x%y);
}
int main()
{
int n,k,aa,bb,cc;
while(~scanf("%d%d%d%d%d",&n,&k,&aa,&bb,&cc))
{
a[0]=aa;
a[1]=bb;
a[2]=cc;
sort(a,a+3);
int flag=0;
for(int i=0;i<=k;i++)
{
if(a[2]*i<=n)
{
int yu=n-a[2]*i;
int contz=k-i;
if(a[0]*contz>yu||a[1]*contz<yu)continue;
if(a[0]==a[1])
{
if(a[0]*contz==yu)flag=1;
continue;
}
if((yu-contz*a[0])%(a[1]-a[0])==0)flag=1;
}
}
if(flag==1)printf("Yes\n");
else printf("No\n");
}
}