-1

The problem is a 0-1 Knapsack and tries to minimize the output based on 2 constraint factors. Can somebody suggest whats wrong with the following code? Its giving WA.I am using a bottom-up approach. Can somebody point out the test-cases where it fails?

#include<cstdio>
#include<climits>

using namespace std;
#define DEBUG 0

inline int min(int x, int y)
{
    int p= (x<y?x:y);
    return p;
}


int dp[1001][22][80];
int main()
{
    int tc,o,n;
    int num;
    int ox[1000],nn[1000],wt[1000];

    scanf("%d",&tc);
    while(tc--){
        scanf("%d %d",&o,&n);
        scanf("%d",&num);

        for(int i=1;i<=num;i++){
            scanf("%d %d %d",ox+i,nn+i,wt+i);
        }

    //DP

        for(int i=0;i<=o;i++){
            for(int j=0;j<=n;j++){
                dp[0][i][j]=INT_MAX;    
            }
        }
        dp[0][0][0]=0;

        for(int items=1;items<=num;items++){
            for(int oxygen=0;oxygen<=o;oxygen++){
                for(int nitrogen=0;nitrogen<=n;nitrogen++){
                    if(oxygen>=ox[items] && nitrogen>=nn[items] &&  dp[items-1][oxygen-ox[items]][nitrogen-nn[items]]!=INT_MAX){
                    dp[items][oxygen][nitrogen]=min(dp[items-1][oxygen][nitrogen],(dp[items-1][oxygen-ox[items]][nitrogen-nn[items]]+wt[items]));
                    }
                    else if(oxygen>=ox[items] && nitrogen<nn[items] && dp[items-1][oxygen-ox[items]][0]!=INT_MAX){
                    dp[items][oxygen][nitrogen]=min(dp[items-1][oxygen][nitrogen],(dp[items-1][oxygen-ox[items]][0]+wt[items]));
                    }
                    else if(nitrogen>=nn[items] && oxygen<ox[items] && dp[items-1][0][nitrogen-nn[items]]!=INT_MAX){
                    dp[items][oxygen][nitrogen]=min(dp[items-1][oxygen][nitrogen],(dp[items-1][0][nitrogen-nn[items]]+wt[items]));
                    }
                    else if(oxygen<ox[items] && nitrogen<nn[items]){
                    dp[items][oxygen][nitrogen]=min(dp[items-1][oxygen][nitrogen],wt[items]);   
                    }
                    else{
                    dp[items][oxygen][nitrogen]=INT_MAX;
                    }
#if DEBUG
                printf("\ndp[%d][%d][%d]=%d",items,oxygen,nitrogen,dp[items][oxygen][nitrogen]);
#endif
                }
            }
        }
        printf("%d\n",dp[num][o][n]);
    }

}
Paul R
  • 208,748
  • 37
  • 389
  • 560
Santosh Gupta
  • 91
  • 1
  • 8

1 Answers1

0

Your program will fail when n=1000 because you are using 1-based indexing for the test cases, and therefore you will be accessing elements beyond the ends of your arrays.

Solution: use 0-based indexing (best solution) or increase the array sizes to 1001 (ugly hack).

There may be other bugs too, but this one definitely needs to be fixed.

Paul R
  • 208,748
  • 37
  • 389
  • 560