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;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
01 가방, 완전 가방, 다중 가방 dp(동적 기획 입문 dp)01 가방은 2진법으로 직접 표시할 수 있지만 데이터 양이 너무 많으면 시간을 초과하는 것이 폭력이다.01 가방의 사상은 바로 이 물품에 대해 내가 넣은 가치가 큰지 안 넣은 가치가 큰지 비교하여 방정식 f[i][v...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.