蒟蒻刚学状压DP求调
查看原帖
蒟蒻刚学状压DP求调
625380
FriedrichC楼主2022/10/27 14:05
#include<bits/stdc++.h>
#define maxn 1000010
using namespace std;
int c[maxn],v[maxn],f[1<<16],sum[maxn];
//f[s]表示钱币的使用状态为s时可以购买到的物品下标
//注意:1表示用了,0表示没用
int main()
{
    int n,k;
    cin>>n>>k;
    for(int i=1;i<=k;++i)cin>>v[i];
    for(int i=1;i<=n;++i)cin>>c[i],sum[i]=sum[i-1]+c[i];
    for(int s=0;s<(1<<k);++s)
    {
        for(int i=1;i<=k;++i)
        {
            if((s&(1<<(i-1)))==0)continue;
            int pos=upper_bound(sum+1,sum+1+n,sum[f[s^(1<<(i-1))]]+v[i])-sum-1;
            f[s]=max(f[s],pos);
        }
    }
    int ans=-1;//无解输出-1
    for(int s=0;s<(1<<k);++s)
        if(f[s]==n)//可以一直购买到n号物品时才是有效答案
        {
            int cnt=0;
            for(int i=1;i<=k;++i)
                if((s&(1<<(i-1)))==0)cnt+=v[i];
            ans=max(ans,cnt);
        }
    cout<<ans<<endl;
	return 0;
}

2022/10/27 14:05
加载中...