五户共井问题(Openjudge 2.1 7623)
描述
有A, B, C, D, E五家人共用一口井,已知井深不超过k米。A, B, C, D, E的绳长各不相同,而且厘米表示的绳长一定是整数。
从井口放下绳索正好达到水面时:
(a)需要A家的绳n1条接上B家的绳1条
(b)需要B家的绳n2条接上C家的绳1条
©需要C家的绳n3条接上D家的绳1条
(d)需要D家的绳n4条接上E家的绳1条
(e)需要E家的绳n5条接上A家的绳1条
问井深和各家绳长。
输入
输入只有1行。包括空格分开的6个整数。
第一个整数k(1 <= k <= 20),代表井的最大深度(单位:米)。
接下来是5个正整数n1, n2, n3, n4, n5。这五个整数的含义见上面的题目描述。
输出
输出只有1行。
如果找到了可行解,就输出6个整数,用空格分开,分别代表井的深度和A, B, C, D, E的绳长(单位都是厘米)。
如果有多组可行解,输出井的深度最小的那组解。
如果不存在可行解,就输出一行:
not found
输入样例
10 2 3 4 5 6
输出样例
721 265 191 148 129 76
思路
1.先分析题目,看出这是一个枚举问题
2.问题属于多方案问题,但题目只需要输出井深最小的那组解
3.确定什么内容构成方案(哪一家的几条绳长+另一家一条绳长=井深)
4.确定内容,确定枚举的顺序与层数
5.加上约束条件
6.得到答案
7.!!!!!注意单位不统一,要换算(井深(米),绳长(厘米))
AC代码
#include<iostream>
#include<iomanip>
using namespace std;
int main()
{
int a,b,c,d,e,n1,n2,n3,n4,n5,k,i,minS=2005;
cin>>k>>n1>>n2>>n3>>n4>>n5;
for(i=1;i<=k*100;i++)//井深从小到大 ,因为k单位是米,所以*100变成厘米
{
for(a=1;a<=i;a++)//枚举a家的绳长
{
b=i-a*n1;//b-e不用循环的原因:6层循环肯定超时,我们由问题描述可得以下的等量关系式
c=i-b*n2;
d=i-c*n3;
e=i-d*n4;
if(e*n5+a==i&&a!=b&&a!=c&&a!=d&&a!=e&&b!=c&&b!=d&&b!=e&&c!=d&&c!=e&&d!=e)//约束条件:A, B, C, D, E的绳长各不相同,所以判断他们的绳长
{
cout<<i<<" "<<a<<" "<<b<<" "<<c<<" "<<d<<" "<<e;
return 0;
}
}
}
cout<<"not found";//如果没有解,在循环外输出即可
return 0;