1 条题解

  • 0
    @ 2023-10-18 10:01:27

    C++ :

    #include<bits/stdc++.h>
    using namespace std;
    const int N=20;
    int w[N],sum[N];
    int ans=N,n,m;
    void dfs(int k,int u)
    {
        if(k>=ans) //剪枝2:最优性剪枝,当前分支不可能优于已有答案 
        {
            return ;        
        }
        if(u==n)
        {
            ans=k;
            return ;
        }
        for(int i=0;i<k;i++)
        {
            if(w[u]+sum[i]<=m) //剪枝3:可行性 
            {
                sum[i]+=w[u];
                dfs(k,u+1);
                sum[i]-=w[u];
            }
        }
        sum[k]=w[u];
        dfs(k+1,u+1);
        sum[k]=0;
    }
    int main()
    {
        cin>>n>>m;
        for(int i=0;i<n;i++) cin>>w[i];
        //剪枝1:优化搜索顺序 
        sort(w,w+n);
        reverse(w,w+n);
        dfs(0,0);
        cout<<ans;
        return 0;
    }
    
    
    • 1

    信息

    ID
    791
    时间
    1000ms
    内存
    128MiB
    难度
    (无)
    标签
    递交数
    0
    已通过
    0
    上传者