【问题标题】:WA on SCUBADIV spojWA on SCUBADIV spoj
【发布时间】:2013-12-09 10:04:36
【问题描述】:

我正在尝试在 spoj.com 上解决 http://www.spoj.pl/problems/SCUBADIV/ 这个问题,但我得到了 WA。我写了一个递归解决方案并使用了记忆。 谁能帮我找出我的错误?在此先感谢:)

int oxygen[1010],nitrogen[1010],weight[1010],n;
int dp[200][200];
// oxy is the amnt of oxygen needed , nitro is the amnt of nitrogen needed , pos     denotes element picked up till now
int calculate (int oxy , int nitro ,int pos){

long long int min = 10000000;
if(oxy <=0 && nitro <=0)
    return 0;
if(dp[oxy+79][nitro+21]!=-1)    
    return dp[oxy+79][nitro+21];
else{
    for(int i=pos+1;i<n;i++){

            int val = calculate (oxy - oxygen[i] ,nitro - nitrogen[i] , i)+ weight[i];

            if(val<min){
                min = val;
            }
        }
    }
    dp[oxy+79][nitro+21]=min;
    return min;

}   

int main(){
int test;
int i,oxy,nitro;
cin>>test;
while(test--){
    cin>>oxy>>nitro;
    cin>>n;
    for( i=0;i<n;i++){
        cin>>oxygen[i]>>nitrogen[i]>>weight[i];
    }
    for(i=0;i<110;i++){
        for(int j=0;j<110;j++){
            dp[i][j]=-1;
        }
    }   

    long long int min =1000000; 
    for(i=0;i<n;i++){
        int val = calculate(oxy-oxygen[i],nitro-nitrogen[i], i)+weight[i];
        if(val<min)
            min = val;
    }

    cout<<min<<endl;
}

return 0;
}

正如所指出的,我查看并发现我阅读了错误的氧气和氮气约束。我修改了该约束的代码,但它给出了错误的答案

int oxygen[1010],nitrogen[1010],weight[1010],n;
int dp[900][900];
// oxy is the amnt of oxygen needed , nitro is the amnt of nitrogen needed , pos denotes element picked up till now
int calculate (int oxy , int nitro ,int pos){

long long int min = 800000;
if(oxy <=0 && nitro <=0)
    return 0;
if(dp[oxy+800][nitro+100]!=-1)  
    return dp[oxy+800][nitro+100];
else{
    for(int i=pos+1;i<n;i++){

            int val = calculate (oxy - oxygen[i],nitro - nitrogen[i] , i)+ weight[i];

            if(val<min){
                min = val;
            }
        }
    }
    dp[oxy+800][nitro+100]=min;
    return min;

}   

int main(){
int test;
int i,oxy,nitro;
cin>>test;
while(test--){
    cin>>oxy>>nitro;
    cin>>n;
    for( i=0;i<n;i++){
        cin>>oxygen[i]>>nitrogen[i]>>weight[i];
    }
    for(i=0;i<100+800;i++){
        for(int j=0;j<800+100;j++){
            dp[i][j]=-1;
        }
    }   
//cout<<"here";
    long long int min =800000;  
    for(i=0;i<n;i++){
        int val = calculate(oxy-oxygen[i],nitro-nitrogen[i], i)+weight[i];
        if(val<min)
            min = val;
    }

    cout<<min<<endl;
}

return 0;
}

【问题讨论】:

    标签: algorithm dynamic-programming knapsack-problem


    【解决方案1】:

    我相信你在这个测试用例上的代码outputs 119(实际上我有时会遇到运行时错误):

    1
    22 175
    5
    3 36 120
    10 25 129
    5 50 250
    1 45 130
    4 20 119
    

    虽然这显然不是正确的答案。希望这可以帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-14
      • 1970-01-01
      • 1970-01-01
      • 2012-12-08
      • 2019-06-06
      • 1970-01-01
      • 2016-03-10
      • 1970-01-01
      相关资源
      最近更新 更多