问题是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]);
}
}
答案 0 :(得分:0)
当n = 1000时,您的程序将失败,因为您对测试用例使用了基于1的索引,因此您将访问数组末尾之外的元素。
解决方案:使用基于0的索引(最佳解决方案)或将数组大小增加到1001(丑陋的黑客)。
可能还有其他错误,但这个肯定需要修复。