동적 프로그래밍이 생소하고 처음으로 DP 문제를 시도했습니다. 문제는 성명서는동적 프로그래밍을 사용하여 배낭에서 항목 검색
크기가 n이고 크기가 []이고 값이 [] 인 배낭이 배낭에 넣을 수있는 항목의 용량을 최대화합니다. 항목은 여러 번 반복 될 수 있습니다. (중복 된 항목이 허용됨).
내가 재발 관계를 수립하고, DP 테이블을 만들고, 결국 배낭에 넣어 수있는 최대 값을 얻을 수 있었지만
, 나는 장치로해야하는 값을 검색하는 방법 수 없습니다입니다 필요한 합계를 얻기 위해 선택되었습니다.여기 내 솔루션입니다 : 내 솔루션에서
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
using namespace std;
int main()
{
int s[] = { 1, 3, 4, 5, 2, 7, 8 , 10};
int v[] = { 34, 45, 23, 78, 33, 5, 7 , 1};
int n = ((sizeof(s))/(sizeof(s[0])));
vector<int> backtrack;
int C = 15;
int pos;
int m[20];
m[0] = 0;
int mx = 0;
for (int j = 1; j <= C; j++) {
mx = 0;
m[j] = m[j-1];
pos = j-1;
for (int i = 0; i < n; i++) {
mx = m[i-s[i]] + v[i];
if (mx > m[i]) {
m[i] = mx;
pos = i - s[j];
}
}
backtrack.push_back(pos);
}
cout << m[C] << endl<<endl;
for (int i = 0; i < backtrack.size(); i++) {
cout << s[backtrack[i]] <<endl;
}
return 0;
}
, I는 벡터에 selcted 최대 값 항목의 위치를 저장하고, 결국 그들을 인쇄하려고 시도했습니다. 그러나 이것은 나에게 정확한 해결책을주지 않는 것 같습니다.
프로그램을 실행하면 생성합니다
79
2
3
0
5
2
7
8
10
34
45
23
78
33
5
7
그것은 출력의 숫자가 출력에 표시되는 항목의 크기가 같은 크기 0의 어떤 항목이 선택되지 못할 출력에서 분명하다.
내 논리 또는 구현에서 오류를 찾는데 도움이되기를 바랍니다. 감사.
:이 있음을 유의하시기 바랍니다 * 숙제 문제가 아닙니다. 그것이 있었다면 나는 그에 따라 태그를 붙 였을 것이다. 한 시간 후에 질문을 입력 한 후에도 (영어가 제 1 언어가 아니기 때문에) 숙제 문제처럼 느껴질 수있어서 정말 죄송합니다. 나는 질문과 같은 숙제로 너를 방해하는 것을 후회한다. 다시 한 번 죄송합니다. – user1043884
분명히 당신의 코드에 문제가있는 배열 문제가 있습니다. 예를 들어'mx = m [is [i]] + v [i]''i = 0' 일 때'm' 인덱스는 -1이 될 것이고,'pos = i-s [j]' 또한'j> = n' 일 때 범위를 벗어난다. –