洛谷 P2729 饲料调配 Feed Ratios

题意

就是有三种饲料,让你输入在每种饲料中大麦,燕麦和小麦各自的比,求出如何混合才能成为给出的完美饲料。

做法

为了方便诉说,我们先将完美饲料的比记作n1:n2:n3,其实也就是求在用最少的饲料的情况下n1t:n2t:n3*t=n1:n2;n3是存在的,我们可以把混合的饲料是原先饲料的t倍,前提是除数不能为0,且t是一个相同的值。 因为每种饲料都不超过100,所以我们可以直接DFS找出最小值。

代码

#include<bits/stdc++.h>
using namespace std;
int ok;
int now[4];//DFS是记录大麦等的比 
int s[4];//分别记录三种饲料的数量,最后取最小值 
struct cnt
{
    int a;
    int b;
    int c;
}p[4];//结构体记录大麦等的比 
int n1,n2,n3;//完美饲料的比 
int ans1=2e9,ans2=2e9,ans3=2e9,ans=2e9;//ans是记录能够制作的数量,其它分别记录三种饲料的数量最优解 
void DFS(int k,int m)
{
    if(k>m)
    {
        if(!s[1]&&!s[2]&&!s[3]) return;//因为不可能全部都是0 
        int t=0;
        if(now[1]&&n1) t=now[1]/n1;
        else if(now[2]&&n2) t=now[2]/n2;
        else if(now[3]&&n3) t=now[3]/n3;//寻找t 
        if(n1*t==now[1]&&n2*t==now[2]&&n3*t==now[3]&&s[1]+s[2]+s[3]<ans1+ans2+ans3)//判断是否达成完美饲料的比 
        {
            ans=t;
            ans1=s[1];
            ans2=s[2];
            ans3=s[3];
            ok=1;
        }
        return;
    }
    for(int i=0;i<=100;++i)
    {
        now[1]+=i*p[k].a; 
        now[2]+=i*p[k].b;
        now[3]+=i*p[k].c;
        s[k]=i;
        DFS(k+1,m);
        now[1]-=i*p[k].a;
        now[2]-=i*p[k].b;
        now[3]-=i*p[k].c;
    }
} 
int main() 
{
    //freopen("ratios.in","r",stdin);
    //freopen("ratios.out","w",stdout);
    scanf("%d%d%d",&n1,&n2,&n3);
    for(int i=1;i<=3;++i)
        scanf("%d%d%d",&p[i].a,&p[i].b,&p[i].c);
    DFS(1,3);
    if(ok) 
       printf("%d %d %d %d\n",ans1,ans2,ans3,ans);
    else printf("NONE\n");  
    return 0;
}

 

posted @ 2022-02-12 16:17  LikC1606  阅读(127)  评论(0)    收藏  举报