洛谷 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; }

浙公网安备 33010602011771号