DP为0-1背包,有两个因素可以优化。链接 - http://www.spoj.com/problems/SCUBADIV/

时间:2015-06-06 07:56:38

标签: c knapsack-problem

问题是0-1背包并尝试根据2个约束因子最小化输出。有人可以建议以下代码有什么问题吗?它给WA.I我使用自下而上的方法。 有人可以指出它失败的测试用例吗?

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

}

1 个答案:

答案 0 :(得分:0)

当n = 1000时,您的程序将失败,因为您对测试用例使用了基于1的索引,因此您将访问数组末尾之外的元素。

解决方案:使用基于0的索引(最佳解决方案)或将数组大小增加到1001(丑陋的黑客)。

可能还有其他错误,但这个肯定需要修复。