校赛 倒咖啡 扩展欧几里得

开始用完全背包写,过不去,不知道思路错在哪儿了;

扩展欧几里德定理

  对于不完全为 0 的非负整数 a,b,gcd(a,b)表示 a,b 的最大公约数,必然存在整
  数对 x,y ,使得 gcd(a,b)=ax+by。

使用扩展欧几里德算法解决不定方程的办法

  对于不定整数方程pa+qb=c,若 c mod Gcd(a, b)=0,则该方程存在整数解,否则不存在整数解。

倒咖啡

Time Limit : 3000/1000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 21   Accepted Submission(s) : 9

Font: Times New Roman | Verdana | Georgia

Font Size:  

Problem Description

有一个足够大的杯子C,没有标明刻度。现有两只杯子A, B,也没有标明刻度,不过我们知道A, B的容量分别为是VA, VB。
请问是否可以使用A, B两个杯子,用尽你可以想到的方法恰好将C中倒入容量为V的咖啡。 

Input

Output

如果可以,输出"YES",否则输出"NO"

Sample Input

15 3 20
5 4 4

Sample Output

YES
NO
#include <iostream>
using namespace std;

int gcd(int x, int y){return (y == 0)?x:gcd(y,x%y);}
int main()
{
	int V,VA,VB;
	while(cin>>V>>VA>>VB)
	{
		if(V%gcd(VA,VB)==0)
		cout<<"YES"<<endl;
		else
			cout<<"NO"<<endl;
	}
	
}

但是用完全背包的过不了,想知道哪里错啦,哪位大神帮忙找找;
我的思路是:物品有4种,价值为VA的,VB的,VA-VB的,还有就是min(VA,VB) -  max(VA,VB)%min(VA,VB);
比如VA = 3;VB = 20;
物品就有:3  30  17  1
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;

int f[1003],V = 1001;
int CompletePack(int cost, int worth)
{
	for(int j = cost; j <= V; j++)
	{
		f[j] = max(f[j], f[j-cost]+worth);
	}
} 

int main()
{
	int V1,VA,VB,a[5];
	while(scanf("%d%d%d",&V1,&VA,&VB)!=EOF)
	{
		a[1] = VA;
		a[2] = VB;
		a[3] = abs(VA-VB);
		a[4] =min(VA,VB) -  max(VA,VB)%min(VA,VB);
		memset(f,0,sizeof(f));
		for(int i = 1; i <= 4;i++)
			CompletePack(a[i],a[i]);
		
		if(f[V1] == V1)
		cout<<"YES"<<endl;
		else
		cout<<"NO"<<endl;
	}
}


你可能感兴趣的:(校赛 倒咖啡 扩展欧几里得)