무차별 대입 방법에 대한 자세한 설명 (1)
무차별 대입 방식
무차별 대입 방법은 일반적으로 무차별 열거라고도 알려진 알고리즘 문제에 사용됩니다. 그 핵심은 다음과 같습니다.횡단즉, 가능한 모든 상황을 열거함으로써 적절한 해결책을 얻을 수 있습니다. 인간의 사고 관점에서 볼 때 이것은 실제로 매우 어리석은 방법입니다.
이점
- 이해하기 쉽고 인간의 사고를 매우 잘 시뮬레이션할 수 있습니다.
- 거의 모든 계산 가능한 분야의 문제를 해결하는 능력
결점
- 발생하는 모든 상황을 순회해야 하며, 알고리즘 시간 오버헤드가 크다
- 소규모 문제를 해결하는 데 적합하며, 규모가 커지면 알고리즘 시간 성능이 크게 저하됩니다.
닭 100마리 사는데 100위안
이것은 매우 고전적인 루프 문제입니다. 프로그래밍을 처음 배울 때 모든 사람이 접하게 될 것이라고 믿습니다. 일반인의 용어로 말하면 다음과 같습니다.
당신은 100위안을 가지고 있습니다. 기존 수탉은 5위안, 암탉은 3위안, 닭은 1위안과 3마리입니다. 그렇다면 구입하는 닭의 종류를 어떻게 할당하여 닭의 수가 100마리와 3마리가 되도록 합니까? 100위안이 정확히 지출되었습니다!
전통적인 폭력 열거
전통적인 사고 방식: 내가 설정한 조건을 충족하는 한 모든 솔루션을 직접 열거합니다.
//수탉의 수를 x, 암탉의 수를 y, 병아리의 수를 z라고 가정합니다.
①x+y+z==100;
②5 x+3 y+z/3==100
이 경우, 내가 얻는 닭의 수가 요건을 충족해야 합니다.
void Chicken(
int x,y;z;
int count-0;
for(x=0;x<=100;x++)//公鸡
{
for (y=0;y<=100;y++)//母鸡
{
z=100-x-y;//小鸡
if((z%3==0)&&(5*x+3*y+z/3==100))//设置条件
{
count++;//解的个数
count<<"公鸡:"<<x<<"母鸡:"<<y<<"小鸡:"<<z<<endl;
}
}
}
if(!count)
cout<<"无解"<<endl;
쓸모없는 열거를 줄입니다
다시 생각해보면 치킨 종류별로 최대 개수가 정해져 있나요?
수탉은 5위안인데, 아무리 사더라도 최대 20마리까지 살 수 있어요.
암탉 3 위안, 최대 33
병아리=100수탉암탉
즉, 닭의 수가 이 최대값을 초과할 수 없으며, 초과할 경우 조건을 만족하지 못해 바로 폐기될 수 있습니다! ! !
void Chicken(
int x,y;z;
int count-0;
for(x=0;x<=20;x++)
{
for (y=0;y<=33;y++)
{
z=100-x-y;
if((z%3==0)&&(5*x+3*y+z/3==100))
{
count++;
count<<"公鸡:"<<x<<"母鸡:"<<y<<"小鸡:"<<z<<endl;
}
}
}
if(!count)
cout<<"无解"<<endl;
최적의 솔루션
여기서 우리는 주로 수학적 지식을 사용하여 알고리즘을 단순화하고, 이는 알고리즘에서 수학의 상태를 보여줍니다!
관계에 따르면:
x+y+z=100
5 x+3 y+z/3=100
사용 가능
①0<=x<=20
②0<=y<=33(정수여야 함)
그러므로 다음과 같이 추론할 수 있다. ③47<=z<=100;
수학적 지식을 기반으로 한 변환
3 ②-1 =>* b=25-(7/4) a
닭의 수는 0보다 크거나 같은 정수이므로 a는 4의 배수여야 합니다. num이 0보다 크거나 같은 정수이면 a는 4 num으로 표현될 수 있고 b는 25-7 num으로 표현될 수 있으며 c는 75+3*num로 표현될 수 있습니다.
0<=a<=20;에 따르면 num을 얻고 범위는 0<=num<=5이고,
0<=b<=33;에 따르면 num을 얻고 범위는 0<=num<=3입니다.
c에 따르면 num을 얻습니다. 범위는 0<=num<=8입니다.
따라서 num의 최종 범위는 0<=num<=3;
for(int num=0;num<=3;++num){
cout<<"公鸡:"<<4*num;
cout<<"母鸡:"<<25-7*num;
cout<<"小鸡:"<<75+3*num<<endl;
}
이 해법은 4번의 순회만으로 풀 수 있어 시간 복잡도가 대폭 줄어들고, 수학의 매력도 볼 수 있어요! ! !