백준 문제 1188번 음식 평론가 문제풀이 c++
https://www.acmicpc.net/problem/1188
1188번: 음식 평론가
첫째 줄에 소시지의 수 N과 평론가의 수 M이 주어진다. (1 ≤ N, M ≤ 100)
www.acmicpc.net
문제해석
예시를 들어 보자
평론가가 소세지보다 많을때 예를 들어 소세지 2개 평론가 5명이 있는경우
소세지 하나의 양을 5라고 두면 한 평론가당 먹어야 하는 양은 2만큼 이고 아래 그림과 같은 과정을 거친다.
첫 과정에서 2번 칼질 한 후에 소세지 2개 평론가 3명이 된다.
두번째 과정에서 2번 칼질 한 후에 소세지 소세지 2개 평론가 1명이 된다.
세번째 과정에서 칼질이 필요없으므로 총 4번의 칼질이 필요하다.
dp[2][5]=2+dp[2][3]
dp[2][3]=2+dp[2][1]
dp[2][1]=0;
식으로 나타내면 이 와같다.
이번엔 소세지가 평론가보다 많은 경우 소세지 5개 평론가 3명을 예를 들어보자
이때 소세지 하나의 양을 3 평론가 한명당 소세지 5를 먹어야한다. 아래의 예시를 거친다.
첫번째 과정에서 칼질없이 소세지 3개를 각각에게 주고 난뒤 소세지 2개 평론가 3명이 남는다.
그 뒤 두번째 과정에서칼질 두번을 하고 2짜리 소세지를 두명의 평론가에게 주고 나면 소세지 2개 평론가 1명이 남는다.
칼질없이 남은거 다주면 끝난다.
총 두번의 칼질이 필요하고 식으로 나타내면 다음과같다.
dp[5][3]=dp[2][3]
dp[2][3]=2+dp[2][1]
dp[2][1]=0;
다른 예시도 이 같은 방식으로 규칙을 찾으면 i=소세지 수, j=평론가 수라고 하면
j<=i 일때 dp[i][j]=dp[i-j][j]
i<j일때 dp[i][j]=i+dp[i][j-i]
이걸 그대로 코드로 옮겨주어 풀었다.
코드
#include <iostream>
#include <algorithm>
using namespace std;
int a[101][101];
int main(){
cout.tie(NULL);
cin.tie(NULL);
ios_base::sync_with_stdio(false);
for(int i=1; i<101; i++)
{
a[1][i]=i-1;
}
for(int i=2; i<101; i++)
{
for(int j=1; j<101; j++)
{
if(j<=i)
{
a[i][j]=a[i-j][j];
}
else
{
a[i][j]=i+a[i][j-i];
}
}
}
int n,m;
cin>>n>>m;
cout<<a[n][m];
}