zoukankan      html  css  js  c++  java
  • ZOJ 3631 Watashi's BG(01dp)

    01dp不过由于数组过于大,开不开,学了搜索过了,先记录下 还有一种方法

    #include<stdio.h>
    #include<algorithm>
    using namespace std;
    
    const int MAXN=10000010;
    int a[MAXN];
    int n,m,ans;
    
    bool cmp(int a,int b)
    {
        return a>b;
    }
    
    int max(int a,int b)
    {
        return a>b?a:b;
    }
    
    void DFS(int s,int num)
    {
        if(s>m) return ;
        if(num>=n) //
        {
            ans=max(s,ans);
            return ;
        }    
        int temp=s;
        for (int i=num;i<n;i++)//若后面的所有数都加进去还比最大的小,就不用比较了
            temp+=a[i];
        if(temp<ans) return;
        /*01背包的精髓,放与不放*/
        DFS(s+a[num],num+1);
        DFS(s,num+1);
    }
    
    int main()
    {
        
        while(scanf("%d%d",&n,&m)!=EOF)
        {
            ans=0;
            for (int i=0;i<n;i++)
                scanf("%d",&a[i]);
            sort(a,a+n,cmp);//剪枝
            DFS(0,0);
            printf("%d\n",ans);
        }
        return 0;
    }
  • 相关阅读:
    随堂练习
    随堂练习
    第六次安卓作业
    第五次安卓
    第四次安卓
    第二次安卓
    安卓作业
    第十八次上机
    第七周作业
    第六周作业
  • 原文地址:https://www.cnblogs.com/zsboy/p/2624183.html
Copyright © 2011-2022 走看看