美文网首页
2018-07-20-01背包入门

2018-07-20-01背包入门

作者: termanary | 来源:发表于2018-07-20 22:24 被阅读0次

    题目:HDOJ-2602
    主要参考:1
    2
    3
    核心代码:
    1:

    for(int i = 1; i <= n; i++)
        {
            for(int j = 0; j <= W; j++)
            {
                if(j < w[i])    dp[i][j]  = dp[i-1][j];
                else dp[i][j] =  max(dp[i-1][j], dp[i-1][j - w[i]] + v[i]);
            }
        }
    

    2:

         for(int i=0;i<n;i++)  
        {  
            for(int j=v;j>=0;j--)  
            {  
                if(j>=c[i])  
                dp[j]=max(dp[j-c[i]]+w[i],dp[j]);  
            }  
        }  
    

    各仿照写了一段,一段AC,一段WA,原因不详。
    AC:

    #include<stdio.h>
    #include<stdlib.h>
    #include<assert.h>
    
    #define N 1000
    
    int main()
    {
        int i,j,n,v,t,va[N],vo[N],*p;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&v);
            for(i=0;i<n;i++)
                scanf("%d",va+i);
            for(i=0;i<n;i++)
                scanf("%d",vo+i);
            p=(int*)calloc(v+1,sizeof(int));
            assert(p);
            for(i=0;i<n;i++)
                for(j=v;j>=vo[i];j--)
                    p[j]=p[j]>p[j-vo[i]]+va[i]?p[j]:p[j-vo[i]]+va[i];
            printf("%d\n",p[v]);
            free(p);
        }
        return 0;
    }
    
    

    WA:

    #include<stdio.h>
    #include<stdlib.h>
    #include<assert.h>
    
    #define N 1000
    
    int _max_(int a,int b)
    {
        return a>b?a:b;
    }
    
    int main()
    {
        int t;
        int va[N],vo[N];
        int n,v;
        int i,j;
        int *p;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d",&n,&v);
            for(i=0;i<n;i++)
                scanf("%d",va+i);
            for(i=0;i<n;i++)
                scanf("%d",vo+i);
    
            p=(int*)calloc((n+1)*(v+1),sizeof(int));
            assert(p);
            int m=v+1;
            for(i=1;i<=n;i++)
            {
                for(j=1;j<=v;j++)
                {
                    if(j<vo[i-1])
                    {
                        p[i*m+j]=p[(i-1)*m+j];
                    }
                    else
                    {
                        p[i*m+j]=_max_(p[(i-1)*m+j],p[(i-1)*m+j-vo[i-1]]+va[i-1]);
                    }
                }
            }
            printf("%d\n",p[(n+1)*(v+1)-1]);
            free(p);
    
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:2018-07-20-01背包入门

          本文链接:https://www.haomeiwen.com/subject/emhcmftx.html