Я пытаюсь решить проблему в названии на SPOJ. Проблема легко распадается на неограниченный рюкзак. Я могу решить базовые тестовые случаи, и, по моему мнению, логика c выглядит нормально. Как только я отправляю, OJ выдает неправильный ответ. Куда я иду не так?
Вот код:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> ii;
int main(){
int t;
cin >> t;
while(t--){
int pig,pigWithMoney;
cin >> pig >> pigWithMoney;
int n = pigWithMoney-pig;
int m;
cin >> m;
vector<ii> vii(m);
for(int i=0; i<m; ++i){
int v,w;
cin >> v >> w;
vii[i] = {v,w};
}
vector<int> dp(n+1,INT_MAX);
dp[0] = 0;
for(int i=1; i<=n; ++i){
for(int j=0; j<m; ++j){
if(i-vii[j].second >=0 && dp[i-vii[j].second] != INT_MAX)
dp[i] = min(vii[j].first + dp[i-vii[j].second], dp[i]);
}
}
if(dp[n] == INT_MAX)
cout << "This is impossible." << endl;
else
cout << "The minimum amount of money in the piggy-bank is " << dp[n] << "." << endl;
}
}