홈>
동적 프로그래밍 질문에 대한 올바른 직관을 개발하려고하지만 질문의 특정 측면을 이해할 수 없습니다.
leetcode https://leetcode.com/problems/coin-change/
많은 튜토리얼에서이 방법과 같은 상향식 접근법이 언급되어 있습니다- https://www.topcoder.com/community/competitive-programming/tutorials/dynamic-programming-from-novice-to-advanced/
이 접근법에서는 최적의 솔루션에서 시작하여 솔루션을 향한 어레이를 구축합니다. 예-우리는 합계 2와 3 등을 찾는 최적의 솔루션을 찾습니다. 결국 우리는 해결책을 갖게 될 것입니다. 이것이 내가 이해하는 접근법입니다.기억으로 다른 재귀 접근 방식으로 머리를 감싸는 데 어려움을 겪고 있습니다. 문제에 대한 역 추적 접근 방식을 작성했지만 메모를 적용하는 방법을 잘 모르겠습니다.
public int changeCoins_BT(int[] coins, int target, int min, int num_curr) {
if(target == 0) {
return min < num_curr ? min : num_curr;
} else if(target < 0) return min;
else if(num_curr > min) return min;
for(int i=0;i<coins.length;i++) {
min = changeCoins_BT(coins,target-coins[i],min,num_curr+1);
}
return min;
}
- 답변 # 1
관련 자료
- c - 헤더 파일의 도우미 함수에서 동적 메모리 할당 문제
- c++ - 동적 문제 해결시 분할 오류
- vue.js - Vue-laravel의 동적 CSS에 문제가 있습니다
- vue.js - 변수를 포함하는 Javascript 동적 모듈 가져 오기 관련 문제점
- 동적 SQL 및 SQL 조인을 통한 다중 검색 기준의 문제점 aspnet C # SQL Server
- java - 동적 프로그래밍 문제 "입력 가격으로 플레이어를 구매 한 후 총 등급이 높아야합니다"
- node.js - Express (NodeJS)에서 동적 매개 변수 일치 문제점이있는 URL
- 동적 URL을 사용할 때 django가 문제 페이지를 찾을 수 없습니다
- python - 동적 프로그래밍으로이 문제를 어떻게 해결할 수 있습니까?
- algorithm - 코인 변경 문제 (다이나믹 프로그래밍 접근법)에 대한 재발 관계에서 +1은 무엇을 의미합니까?
- c++ - 문자열에 대한 동적 포인터 배열 선언 문제
- javascript - 동적 페이지가있는 메타 태그에 대한 기본 질문
- c - 정적 라이브러리와 동적 라이브러리 연결 문제
- python - "이 질문에서 '함수 호출 문제'를 해결하는 방법"
- case study - sql 질문 - 왜 문제를 해결할 수 없습니까?
- sql server - 동적 SQL 쿼리의 연결 문제
관련 질문
- algorithm : 재귀 알고리즘 복잡성?
- algorithm - 재귀 방법의 Big O 복잡성
- javascript - 행복한 번호 알고 질문 솔루션이 작동하지 않습니다
- javascript - 알고리즘 교번 동작 재귀
- python - 단계별 (x, y) 좌표 목록에서 직선 이동 단순화
- javascript - 함수 호출을 반환하는 것과 재귀 중에 함수를 다시 호출하는 것의 차이점은 무엇입니까?
- python - 파워 세트 예제를 사용한 재귀 이해
- python - 첫 번째와 마지막 문자를 제거하는 것뿐만 아니라 문자열이 k- 회문인지 확인
- algorithm - Lisp withous map 함수에서 순열 생성
- javascript : 효율적인 비용을 찾기 위해 행렬 체인 곱셈을 사용할 때 결과로 무한 제공
DP에 대한 재귀 솔루션을 찾기 전에 문제의 하위 문제를 식별하십시오. 각 하위 문제는 상위 문제와 동일하므로 동일한 알고리즘이 적용됩니다.
분모, d [] 및 sum, S의 목록이 제공되는 동전 변경에 대한 예를 들어 보자. 우리는 S까지 합산하기 위해 최소 교단 수, (교단 수)를 찾아야합니다. 카운트를 찾기위한 솔루션 (방법)을 정의 int findMinDenom (int [] d, int S). 이 시점에서 우리는 어떤 구현이 될지는 모르지만 문제에 필요한 매개 변수는 d와 S입니다.
하위 문제는 해결 방법은 같지만 합계는 더 낮습니다. 따라서 findMinDenom이 각 하위 문제를 해결하는 방식으로 구현하려고합니다. 이것은 우리가 더 낮은 합계를 가진 동일한 메소드를 호출하는 재귀 솔루션으로 이어질 것입니다.
DP를 사용하여 방금 해결했습니다. 그러나 메모는 없습니다. 배열을 사용하여 결과를 유지하는 방법을 소개합니다. 하위 문제가 이미 해결되지 않았기 때문입니다. 그렇다면 해당 하위 문제의 결과를 반환하십시오. 합계 0의 경우 교파는 0이됩니다. 솔루션 [0] = 0이 있으며 문제 S에 대한 솔루션을 코딩 용어로 솔루션 [S]로 찾고자합니다. 따라서 솔루션 배열의 크기는 S + 1입니다.
이제 재귀 방법의 솔루션을 전달하십시오.