博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Lightoj 1127 - Funny Knapsack 【二分】
阅读量:7026 次
发布时间:2019-06-28

本文共 1305 字,大约阅读时间需要 4 分钟。

题目链接:

题意:有n个物体(n<30)和一个容量为W的容器。问将容器不装满的放置物品的方式有多少种。

思路 : 状态压缩+二分。将前n/2个物体看做一个总体,将剩下的看做一个总体。1<<(n/2)个状态代表前一半的物品使用情况,然后求出每一种状态的总的体积。排序。对于后面的那一半也是。答案仅仅需枚举一半然后在还有一半中找和W差的下界就可以。

代码:

#include 
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;int n;long long w;long long a[1000000];long long s1[1000000];long long s2[1000000];int main(){ int t; scanf("%d", &t); int cases = 1; while (t--) { memset(s1, 0, sizeof(s1)); memset(s2, 0, sizeof(s2)); memset(a, 0, sizeof(a)); scanf("%d %lld", &n, &w); for (int i = 0; i < n; i++) scanf("%lld", &a[i]); int t1 = n >> 1; int t2 = n - t1; int r1 = 1 << t1; int r2 = 1 << t2; for (int i = 0; i < r1; i++) for (int j = 0; j < t1; j++) { if (i &(1 << j)) s1[i] += a[j]; } for (int i = 0; i < r2; i++) for (int j = 0; j < t2; j++) { if (i &(1 << j)) s2[i] += a[t1 + j]; } sort(s2, s2 + r2 ); long long ans = 0; for (int i = 0; i < r1; i++) { if (w - s1[i] >= 0) ans += upper_bound(s2, s2 + r2, w - s1[i]) - s2; } printf("Case %d: %lld\n", cases++, ans); } return 0;}

转载地址:http://ptoxl.baihongyu.com/

你可能感兴趣的文章
BCH应用热潮助力BCH生态壮大
查看>>
大数据基础知识全集,大数据爱好者收藏必备
查看>>
Mongodb副本集实现
查看>>
我的友情链接
查看>>
Oracle查询中rownum与Order by查询的关系(取数据的前几条)
查看>>
一起研究系列:LINUX目录介绍
查看>>
安装libxml2-2.9.1时报错的处理
查看>>
16.Azure站点到站点***隧道(非专线)(下)
查看>>
使用Java反射机制将Map转换为Java对象,支持Boolean、Date类型
查看>>
pnp4nagios在icinga2上安装注意事项
查看>>
Nginx 启动脚本/重启脚本
查看>>
Nginx根据客户端版本号跳转至后台相应服务器
查看>>
《javascript DOM编程艺术》读后
查看>>
Cisco IOS Zoned-Based Policy Firewall
查看>>
STP HSRP LSA TRACK SLA和NAT结合实现网络出口的冗余
查看>>
人不疯狂何以成功
查看>>
linux 进程基础(一)
查看>>
Android手机Root后的安全问题汇总
查看>>
Oracle从零开始18——表的管理08——数据库备份与恢复
查看>>
高性能分布式闪存系统探讨
查看>>