首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >水肺中的WA (自上而下dp)

水肺中的WA (自上而下dp)
EN

Stack Overflow用户
提问于 2013-12-16 17:55:06
回答 2查看 490关注 0票数 1

我被困在这个问题得到WA。

我看到了许多自下而上的实现这个问题。我的自上而下的实现不是用回忆录工作的,没有回忆录也很好。我怎么改正呢??

代码语言:javascript
复制
#include<cstdio>
#include<cstring>
#include<iostream>

#define INF 0x7FFFFFFF

using namespace std;

int o,n,num,ox[2000],nt[2000],wt[2000];
int dp[2000][2000];

int dive(int index,int oxygen,int nitrogen,int weight) {
    if(dp[oxygen][nitrogen]!=-1) return dp[oxygen][nitrogen];
    int &ret=dp[oxygen][nitrogen];
    if(oxygen>=o&&nitrogen>=n) {
        ret=weight; 
        return ret;
    }
    if(index==num) {
        ret=INF;
        return ret;
    }
    ret= min(dive(index+1,oxygen+ox[index],nitrogen+nt[index],weight+wt[index]),dive(index+1,oxygen,nitrogen,weight));  
    return ret;
}

main() {
    int c;
    scanf("%d",&c);
    while(c--) {
        memset(dp,-1,sizeof(dp));
        scanf("%d%d",&o,&n);
        scanf("%d",&num);
        for(int i=0;i<num;++i) {
            scanf("%d%d%d",&ox[i],&nt[i],&wt[i]);
        }
        printf("%d\n",dive(0,0,0,0));
    }
    return 0;
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-16 18:52:44

试试这个测试:

代码语言:javascript
复制
1
21 79
5
1 1 800
1 1 800
1 1 800
1 1 800
17 75 800

在我看来,答案是正确的,因为它应该是800 * 5 = 4000,对吗?您的程序输出一些其他的东西

票数 1
EN

Stack Overflow用户

发布于 2015-03-21 14:33:31

这也给出了错误的答案:(有人能检查一下吗?

代码语言:javascript
复制
    #include<iostream>
    using namespace std;
    int swap( int &a,int &b)
    {
       int temp=a;
       a=b;
       b=temp;
    }
    int min(int a, int b)
    {
    if(a<b)return a;else return b;
    }
    int max(int a,int b) 
    {
    if(a>b)return a;else return b;
    }
    int minweight(int ans[][22][80],int arr[][3],int n,int oxy,int nit)
    {
     int prev=0,curr=1;

    for(int i=1;i<=n;i++)
    {

        for(int j=0;j<=21;j++)
            for(int k=0;k<=79;k++)
                ans[curr][j][k]=min( ans[prev][j][k], arr[i][2]+ans[prev][max(0,j-arr[i][0])][max(0,k-arr[i][1])]);
        swap(curr,prev);
}


        return ans[n&1][oxy][nit];
    }
   int main()
   {
    int cases;
    cin>>cases;

    while(cases--)
    {
        int oxy,nit;
        cin>>oxy>>nit;
        int n;
        cin>>n;
        int arr[n+1][3];
        for(int i=1;i<=n;i++)
        {
            cin>>arr[i][0]>>arr[i][1]>>arr[i][2];
        }   
        int ans[2][22][80];

            for(int j=0;j<oxy+1;j++)
                for(int k=0;k<nit+1;k++)
                    ans[0][j][k]=9999;
            ans[0][0][0]=0;

        cout<<minweight(ans,arr,n,oxy,nit);
    }

}

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20617505

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档