这题听说可以用行列式,但我不会。
这题范围比较小,所以一个一个试过去吧。但个人比较喜欢从总数最小开始,再搜。
#include <iostream>#include <cstdio>
#include <cmath>
#include <algorithm>
#include <iomanip>
using namespace std;
int s[5][5],s1[4];
bool flag[4];
bool flag1;
int main()
{
//freopen("ratios.in","r",stdin);
//freopen("ratios.out","w",stdout);
for(int i=0;i<=3;i++)
for(int j=1;j<=3;j++)
cin>>s[i][j];
for(int i=1;i<=3;i++)
if(s[0][i]==0)flag[i]=true;
for(int n=1;n<=300;n++){
for(int i=0;i<=n&&i<=100;i++){
int n1=n-i;
for(int j=0;j<=n1&&j<=100;j++){
int n2=n1-j;
flag1=false;
for(int k=1;k<=3;k++)
{
s1[k]=s[1][k]*i+s[2][k]*j+s[3][k]*n2;
if(flag[k]&&s1[k]!=0)flag1=true;
}
if(!flag1)
if((flag[1]||(s1[1])%s[0][1]==0)&&(flag[2]||(s1[2])%s[0][2]==0)&&(flag[3]||(s1[3])%s[0][3]==0)){
int n3,kk;
for(kk=1;kk<=3;kk++){
if(flag[kk])continue;
n3=(s1[kk])/s[0][kk];
break;
}
if(kk==3){cout<<i<<" "<<j<<" "<<n2<<" "<<n3<<endl;
return 0;}
for(int kkk=kk+1;kkk<=3;kkk++)
{if(flag[kkk]||n3==(s1[kkk])/s[0][kkk]);
else break;
if(kkk==3){cout<<i<<" "<<j<<" "<<n2<<" "<<n3<<endl;
return 0;}
}
}
}
}
}
cout<<"NONE"<<endl;
return 0;
}