BZOJ3717: [PA2014]Pakowanie 状压dp
我们发现最多只会用 n 个背包.
令 f[S] 表示装完 S 的物品所需最少背包数量.
令 g[S] 表示满足 f[S] 的情况下剩余的最大重量.
转移略复杂,细节比较多.
code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | #include <bits/stdc++.h> #define N 24 #define inf 0x3f3f3f3f #define setIO(s) freopen(s".in","r",stdin) using namespace std; int f[1<<N],a[N*10],c[N*10],g[1<<N]; bool cmp( int i, int j) { return i>j; } int main() { // setIO("input"); int n,m; scanf ( "%d%d" ,&n,&m); for ( int i=0;i<n;++i) scanf ( "%d" ,&a[i]); for ( int i=0;i<m;++i) scanf ( "%d" ,&c[i]); sort(c,c+m,cmp); memset (f,0x3f, sizeof (f)); f[0]=-1; for ( int i=1;i<(1<<n);++i) { for ( int j=0;j<n;++j) if (i&(1<<j)) { int bi=1<<j; if ((f[i^bi]<f[i]&&g[i^bi]>=a[j])||(f[i^bi]==f[i]&&g[i^bi]-a[j]>g[i]&&g[i^bi]>=a[j])) f[i]=f[i^bi],g[i]=g[i^bi]-a[j]; if ((f[i^bi]+1<f[i]||(f[i^bi]+1==f[i]&&c[f[i^bi]+1]-a[j]>g[i]))&&f[i^bi]+1<m&&c[f[i^bi]+1]>=a[j]) f[i]=f[i^bi]+1,g[i]=c[f[i]]-a[j]; } } if (f[(1<<n)-1]==inf) printf ( "NIE\n" ); else printf ( "%d\n" ,f[(1<<n)-1]+1); return 0; } |
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】博客园携手 AI 驱动开发工具商 Chat2DB 推出联合终身会员
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 依赖注入中的 Captive Dependency
· .NET Core 对象分配(Alloc)底层原理浅谈
· 聊一聊 C#异步 任务延续的三种底层玩法
· 敏捷开发:如何高效开每日站会
· 为什么 .NET8线程池 容易引发线程饥饿
· 终于决定:把自己家的能源管理系统开源了!
· 外部H5唤起常用小程序链接规则整理
· C#实现 Winform 程序在系统托盘显示图标 & 开机自启动
· 了解 ASP.NET Core 中的中间件
· 详解:订单履约系统规划