有什么区别
查看原帖
有什么区别
480934
xqqQwQ_楼主2021/10/19 23:14
#include<bits/stdc++.h> // 状压dp 模板

using namespace std;

int n,m;

int f[1<<19],g[1<<19];
int a[20];

int main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    for(int i=0;i<=1<<n;i++) 
    {
        f[i]=2147483647;
        g[i]=-2147483646;
    }
    f[0]=1;
    g[0]=m;
    for(int i=0;i<(1<<n);i++)
    {
        for(int j=1;j<=n;j++)
        {
            int k=j-1;
            if(i&(1<<k)) continue;
            if(g[i]>=a[j])
            {
                if(f[i]<=f[i|1<<k]) 
                {
                    f[i|1<<k]=f[i];
                    g[i|1<<k]=max(g[i|1<<k],g[i]-a[j]);
                }
            }
            else
            {
                if(f[i]+1<=f[i|1<<k])
                {
                    f[i|1<<k]=f[i]+1;
                    g[i|1<<k]=max(m-a[j],g[i|1<<k]); //g[i|1<<k]=m-a[j];
                }
            }
        }
    }
    cout<<f[(1<<n)-1]<<endl;
    return 0;
}

按注释中的写法得出来的答案比正解还要小

不能李姐了

2021/10/19 23:14
加载中...