————————————————————————————————————————————————————
总感觉第一个题解状态更新的有点问题。
体积取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]; }