리스트에서 최대 숫자와 동일한 숫자의 모든 콜렉션을 찾는 방법. 예를 들어 : 입력 배열 = {2,3,4,9-} 출력 = {2,3,4}는 {9}리스트에서 최대 숫자와 같은 숫자의 모든 콜렉션을 찾는 방법
0
A
답변
0
는 당신이 요구하는 것은 실제로 SubsetSum problem.First이 최대 값을 찾을 수 있습니다 동적 프로그래밍을 적용하여 합계가 목록의 최대 값 인 숫자 집합을 생성합니다.
구현하려면 동적 재 프로그래밍을 사용하여 Java 재귀 및 HashTable 문제를 해결하십시오. HashTable은 계산을 저장하여 성능을 향상시킵니다.
0
실제로는 부분 집합 합계 문제입니다. 특정 합계에 대해 부분 집합이 존재하는지 확인하는 곳. 특히 합 = 최대 요소
그래서 제리스트의 최대 요소를 찾아 내고 동일 그것은 그 합계 서브 세트가 있는지 알려주는 동적 프로그래밍 알고리즘
부분 합계 문제점 합계를 넣어 다음
주어진 숫자와 같습니다. 예제 코드 아래
지금 우리가 세트가 그 세트에 대해 우리가 누구의 합이 목록의 max_element 동일 모든 부분 집합을 가지고, 그래서 출력 explained and detailed here
#include <cstdio>
#include <vector>
using namespace std;
bool** dp;
void display(const vector<int>& v) {
for (int i = 0; i < v.size(); ++i)
printf("%d ", v[i]);
printf("\n");
}
void output(const vector<int>& a, int i, int sum, vector<int>& p) {
if (i == 0 && sum != 0 && dp[0][sum]) {
p.push_back(a[i]);
display(p);
return;
}
if (i == 0 && sum == 0) {
display(p);
return;
}
if (dp[i - 1][sum]) {
vector<int> b = p;
output(a, i - 1, sum, b);
}
if (sum >= a[i] && dp[i - 1][sum - a[i]]) {
p.push_back(a[i]);
output(a, i - 1, sum - a[i], p);
}
}
void find(const vector<int>& a, int sum) {
if (a.size() == 0 || sum < 0) return;
dp = new bool*[a.size()];
for (int i = 0; i < a.size(); ++i) {
dp[i] = new bool[sum + 1];
dp[i][0] = true;
}
for (int i = 1; i < sum + 1; ++i)
dp[0][i] = (a[0] == i) ? true : false;
for (int i = 1; i < a.size(); ++i)
for (int j = 0; j < sum + 1; ++j)
dp[i][j] = (a[i] <= j) ? dp[i - 1][j] || dp[i - 1][j - a[i]] : dp[i - 1][j];
if (!dp[a.size() - 1][sum]) {
printf("There are no subsets with sum %d\n", sum);
return;
}
vector<int> p;
output(a, a.size()-2, sum, p);
}
int main() {
vector<int> a = {1,2,3,4,5,6,10};
int max = 10;
find(a, max);
return 0;
}
4 3 2 1
5 3 2
5 4 1
6 3 1
6 4
입니다. 정렬 후 정렬 이후에 하위 집합을 찾으려면 동적 프로그래밍을 시작해야하므로 위 예제에서 제공된 입력은 정렬 된 목록입니다.
실제로 철저한 검색 결과는 O (2^n) 시간이되므로 동적 프로그래밍을 사용하여 위의 방법으로 개선해야합니다.
관련 문제
- 1. 숫자의 연속 숫자의 최대 합
- 2. 숫자가없는 숫자와 숫자의 행
- 3. 숫자의 위치를 찾는 방법
- 4. 리스트에서 위치를 찾는 것,
- 5. Python :리스트에서 문장의 출현을 찾는 방법
- 6. 숫자의 모든 제수를 효율적으로 찾는 것
- 7. C에서 숫자의 모듈을 찾는 방법 #
- 8. 숫자의 기본 뿌리를 찾는 방법
- 9. 큰 숫자의 계승을 찾는 방법
- 10. 리스트에서 상호 이름을 찾는 알고리즘
- 11. 액션 스크립트 3 - 숫자와 같은 숫자의 배수 설정
- 12. 행렬의 첫 번째 숫자와 모든 연속적인 숫자의 차이를 결정하는 것은
- 13. 리스트에서 변수를 사용하는 방법
- 14. 배열의 인접하지 않은 숫자의 최대 합계에 대해 선택된 숫자의 인덱스를 찾는 방법
- 15. 빠른 숫자의 다음 배수를 찾는 방법
- 16. 숫자의 제곱근을 찾는 알고리즘?
- 17. C#의 숫자와 큐브 숫자의 합
- 18. 큰 숫자와 작은 숫자의 문자열을 숫자로 변환
- 19. 리스트에서 같은 길이의 아이템 계산하기
- 20. 재귀 함수를 사용하여 숫자의 제곱근을 찾는 방법?
- 21. 매우 큰 숫자의 요인을 찾는 방법
- 22. 숫자의 제곱근을 찾는 Bash 스크립트 (바빌론 방법)
- 23. 자바 주어진 숫자의 양수 약수를 찾는 방법
- 24. 테이블의 최대 수를 찾는 방법
- 25. SQLite에서 숫자의 위력을 찾는 법
- 26. 로컬 최대 값을 찾는 방법
- 27. 루비 : 숫자와 같은 수업을 다루는가?
- 28. 숫자와 특정 숫자 세트의 모든 추가 결합을 찾는 알고리즘?
- 29. 리스트에서 최대 절전 모드 및 삭제하기
- 30. 이 코드에서 모든 숫자의 최대 인접한 합계를 찾는 데 잘못되어 있습니까?
시도한 것과 시작한 곳에서 시작할 수 있습니까? 이 질문은 대부분 닫힐 가능성이 큽니다. –
이것이 알고리즘 유형 질문이라고 생각합니다. –