UVaOJ-674 Coin Change(전체 백팩)

제목:
1,5,10,25,50 다섯 종류의 동전이 있는데 금액을 하나 주고 몇 가지 돈을 모으는 방식이 있는지 물어보세요.
아이디어:
밀다
먼저 dp수조를 모두 0으로 초기화하고 dp[0]=1, dp[i]는'액면가 i로 돈을 모으는 종류'를 나타낸다.
for(i=0;i <5;i++) {//5가지 액면가를 나타내는 동전으로 현재 이전 i가지 for(j=0;j < N - 100;j++) {//j는 액면가를 나타냅니다
                         ......//액면가당 모금 종수를 갱신
               }         }
그 실례는 다음과 같다.
i=1시 dp수조는 1원과 5원짜리 동전을 보관할 때 각 액면가의 돈을 모으는 방식이다.
현재 i=2, 우리는 액면가 10의 동전을 새로 넣어야 한다.
pp[j]는 원래 1,5 두 가지 동전으로만 j원을 모으는 방안수입니다. 여기에 반드시 10원으로 j원을 모으는 방안수를 포함해야 합니다. 바로 1,5,10 세 가지 동전의 j원을 모으는 방안수입니다!그러나 어떻게 이런 액면가를 새로 넣은 동전의 모으기 종류를 구할 수 있습니까?
먼저 상태 이동 방정식 dp[j]=dp[j]+dp[j-coin[i]를 말한다.
dp[j-coin[i]는 1,5,10 세 가지 동전으로 j-coin[i]원을 모으는 방안수입니다. 물론 이 안에 1,5 두 가지 동전만 포함된 경우도 있습니다. 하지만 여기서 j원을 모으려면 코인[i](즉 10원)을 하나 더 넣어야 합니다. 이 금액을 더하면 방안의 수량은 변하지 않습니다. 따라서 dp[j-coin[i]은 반드시 10원을 모아야 하는 방안수입니다.
코드:
#include <stdio.h>
#define N 8000
int coin[5] = {1, 5, 10, 25, 50};
int dp[N] = {1};

int main()
{
	int i, j, n;
	for (i = 0; i < 5; i ++){
		for(j = 0; j < N - 100; j ++)
			dp[j + coin[i]] += dp[j];
	}

	while (scanf("%d", &n) != EOF)
		printf("%d
", dp[n]); return 0; }

좋은 웹페이지 즐겨찾기