※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 15817번 문제인 배수 공사이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/15817 

 

15817번: 배수 공사

합친 파이프의 길이 x를 만들 수 있는 방법의 수를 출력한다. 방법의 수가 2,147,483,647를 넘는 경우는 없다.

www.acmicpc.net

각 길이의 파이프는 0~C개씩을 선택할 수 있고, 같은 길이의 파이프는 두번 이상 주어지지 않는다는 점을 눈여겨보자.

이를 이용하여 각 길이의 파이프마다 개수별로 knapsack 문제를 풀듯이 문제를 해결할 수 있다.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int arr[10001];

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	arr[0] = 1;

	int N, x; cin >> N >> x;
	while (N--) {
		int L, C; cin >> L >> C;
		for (int i = x; i > 0; i--) {
			int LL = 0;
			for (int j = 0; j < C; j++) {
				LL += L;
				if (i - LL < 0) break;
				arr[i] += arr[i - LL];
			}
		}
	}

	cout << arr[x] << '\n';
}
728x90

+ Recent posts