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]);
}
}