私はダイナミックなプログラミングには新しく、ここでは整数ナップザック問題をSPOJ (http://www.spoj.pl/problems/KNAPSACK/で試しました。しかし、特定のテストケースでは、私の解決策は正しい出力を出すことができません。私の次の実装が正しいかどうかを提案できれば、あなたに感謝します。変数back
はバックトラッキングのためのものであり、その方法についてはわかりません。私はバックトラックの実装にもあなたの助けを借りて願っています。ありがとう。ここで整数ナップザックを解決する
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <string>
#include <iostream>
using namespace std;
int knapsack(int value[], int weight[], int n, int C,
vector <int>&back)
{
int *M = new int[C + 1];
int k;
int i, j, tmp, pos;
for (i = 1; i <= C; i++) {
M[i] = M[i - 1];
pos = i - 1;
for (j = 0; j < n; j++) {
k = i - weight[j];
if (k >= 0)
tmp = M[k] + value[j];
if (tmp > M[i]) {
M[i] = tmp;
}
}
back.push_back(pos);
}
int ans = M[C];
delete[]M;
return ans;
}
int main()
{
int C, N;
cin >> C >> N;
int* value = new int[N+1];
int* weight = new int[N+1];
for (int i = 0; i <= N; i++) {
cin>>value[i]>>weight[i];
}
vector <int>back(N, 0);
cout<<knapsack(value,weight,N,C,back)<<endl;
return 0;
}
正しい入力/出力テストケースは以下のとおりです。
Input:
4 5
1 8
2 4
3 0
2 5
2 3
Output:
13
はしかし、私は取得しています出力は17
です。
ベクターを用いる「しかし、与えられたテストケースのために私の解決策は、正しい出力を与えていません。」の配列を割り当てません。どの入力?どのようなアウトプットが正しいと思いますか?あなたは実際にどのようなアウトプットを得ましたか? – abelenky
@EitanT:いいえ、そうではありません。 – hytriutucx