A Variation of Unbounded knapsack! C++


#1

int Solution::solve(const vector &A, const vector &B, const vector &C) {
vector A1;
vector B1;
vector C1;
A1=A;
B1=B;
C1=C;
sort(A1.begin(), A1.end());
int n = B1.size();
int w = A1[A1.size()-1];
int t[n+1][w+1];
int sum=0;

for(int i=0; i<n+1; i++) {
    t[i][0] = 0;
}

for(int j=0; j<w+1; j++) {
    t[0][j] = INT_MAX/2;
}

for(int i=1; i<n+1; i++) {
    for(int j=1; j<w+1; j++) {
        if(B1[i-1]<=j) {
            t[i][j] = min(C1[i-1] + t[i][j-B1[i-1]], t[i-1][j]);
        }
        else {
            t[i][j] = t[i-1][j];
        }
    }
}

for(int i=0; i<A1.size(); i++) {
    sum = sum + t[n][A1[i]];
}
return sum;

}


#2

Why did u initialize the first row with INT_MAX/2 and not by INT_MAX?


#3

@sneh2706 it is initialized like that to avoid integer overflow when u add C[i-1] to that value. If its INT_MAX then it will overflow and give some negative number and hence wrong ans. Though its not necessary to do INT_MAX/2 you can make any fair assumption. Mine worked for INT_MAX/10 as well. Exact limit could have been found out if constraints for cost were given in the question.