开始用完全背包写,过不去,不知道思路错在哪儿了;
扩展欧几里德定理
对于不完全为 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的咖啡。
请问是否可以使用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; } }