挑战编程地址:http://www.programming-challenges.com/pg.php?page=downloadproblem&probid=110707&format=html
参考地址:http://www.cppblog.com/lzh/archive/
解析:就是线性方程的求解。
#include <iostream>
#include <cmath>
#include <cstring>
#include <algorithm>
#include <cstdio>
#define INF 0xfffffff
using namespace std;
long long x,y,d;
void Swap()
{
long long t=x;
x=y;
y=t;
}
void Extend_gcd(long long a,long long b)
{
if(!b) x=1,y=0,d=a;
else
{
Extend_gcd(b,a%b);
Swap();
y-=x*(a/b);
}
}
int main()
{
long long m,n;
long long c1,c2,n1,n2;
while(cin>>n&&n)
{
cin>>c1>>n1>>c2>>n2;
if(n1>=n2) Extend_gcd(n1,n2);
else Extend_gcd(n2,n1),Swap();
int t1,t2,t,a,b;
t1=ceil(-n*(double)x/(double)n2);//与下式a,b大于等于0有关系,进行求解
t2=floor(n*(double)y/(double)n1);//返回小于或者等于指定表达式的最大整数
if((t1>t2)||(n%d!=0)) //若t1>t2表示两者不可同时为正
{
cout<<"failed\n";
continue;
}
if(c1*n2>=c2*n1) //比较价值量
t=t1;
else
t=t2;
a=n*x/d+t*n2/d;
b=n*y/d-t*n1/d;
cout<<a<<" "<<b<<endl;
}
return 0;
}