P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper

P3052 [USACO12MAR]摩天大楼里的奶牛Cows in a Skyscraper

————————————————————————————————————————————————————

总感觉第一个题解状态更新的有点问题。

体积取max应该是在dp数组不更新的前提下进行的吧

就写了一个分情况讨论相等与大于,不过和不分情况的一样都过了,数据问题?

懒得造数据试试了【

——————————————————————————————————————————————————

#include<bits/stdc++.h>
using namespace std;
int n,wt,w[22],mv[(1<<18)+5],dp[(1<<18)+5]
int main()
{
    memset(dp,63,sizeof(dp));
    cin>>n>>wt;
    dp[0]=1;mv[0]=wt;
    for(int i=1;i<=n;i++)cin>>w[i];
    for(int i=0;i<1<<n;i++)
    for(int j=1;j<=n;j++)
        if(!(i&(1<<j-1)))
        {
            if(mv[i]>=w[j]&&(dp[i|(1<<j-1)]>=dp[i]))
            {
                if(dp[i|(1<<j-1)]>dp[i])
            {
                dp[i|(1<<j-1)]=dp[i];
                mv[i|(1<<j-1)]=mv[i]-w[j];
            }
            else mv[i|(1<<j-1)]=max(mv[i]-w[j],mv[i|(1<<j-1)]);
            }
                
            if(mv[i]<w[j]&&(dp[i|(1<<j-1)]-1>=dp[i]))
            {
                if(dp[i|(1<<j-1)]-1>=dp[i])
            {
                dp[i|(1<<j-1)]=dp[i]+1;
                mv[i|(1<<j-1)]=wt-w[j];
            }
            else mv[i|(1<<j-1)]=max(wt-w[j],mv[i|(1<<j-1)]);
            }        
        }
    cout<<dp[(1<<n)-1];    
}

 

上一篇:Luogu P3052 [USACO12MAR]Cows in a Skyscraper G


下一篇:dp(01背包问题)