http://ac.nbutoj.com/Problem/view.xhtml?id=1480

  • [1480] 懒惰的风纪委Elaine

  • 时间限制: 1000 ms 内存限制: 65535 K
  • 问题描述
  • Elaine是学园都市中的一个风纪委,每天都会接到命令对某个街道进行检查,并抓捕危险分子。她所在的风纪委支部附近有M条街道。这些街道由北到南并排均匀的分布在一条直线上,每条街道之间的距离都为1。但是众所周知,Elaine是一个很懒很懒的人(-..-说我坏话!!被我看到了!!),她不想一步一步走完所有街道,但好在她的好友Kuso为她制作了大量的传送卷轴。不过,因为Kuso的能力等级太低,他制作的卷轴有严重的缺点,他的卷则只能向南飞一段固定的距离(当然,他预先制作了很多种类的卷轴),而Elaine所在的风纪委支部却在最北边。每一次出去检查,Elain都要使用好几张卷轴。但如果是某些不能传送到的地方,Elaine只能走过去了。不过回来的话,她就可以用自带的传送系统传送到支部的传送点。

    有一天,Elaine想知道,如果她从风纪委支部出发,可以检查那些街道。她手里有N种传送卷轴(1,2,3,,,N),每个卷轴可以传送的距离为Ai,卷轴的数量为Ci。则Elaine靠那些卷轴,可以不走路而直接传送的有哪些街道?

  • 输入
  • 数据有多组输入。每一组数据的第一行有两个数:N,M(0<N<=100,0<M<=1000)。分别表示传送卷轴的种类数和街道数量。在第二行有2N个数,A1,A2,A3...An,C1,C2,C3...Cn (1<=Ai<=100000,1<=Ci<=1000)。数据输入以0 0结束。
  • 输出
  • 每组数据占一行,输出一个数,为Elaine可以传送到的街道总数。
  • 样例输入
  • 3 10
    1 2 4 2 1 1
    2 5
    1 4 2 1
    0 0
  • 样例输出
  • 8
    4
  • 先将多重背包转换成01背包,然后在求解01背包:
  • 任何一个正整数N  都可以分解成 N = 2^0 + 2^1 + 2^2+......+(剩下不足2^n的部分)
  • 例如:13  = 1 + 2 + 4 + 6
  • 这里是对数量进行拆分;  这样的好处可以很好的降低复杂度,从O(N*N)降到O(N*logN)
  •  1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<vector>
     5 using namespace std;
     6
     7 int dp[1010];
     8 int a[110];
     9 vector<int> v;
    10
    11 int main()
    12 {
    13     int n,m;
    14         while(scanf("%d%d",&n,&m)&&n&&m)
    15         {
    16
    17             int i,j;
    18             for(i=0;i<n;i++)
    19             {
    20                 scanf("%d",&a[i]);
    21             }
    22
    23             //多重背包转换成01背包
    24             v.clear();
    25             int t;
    26             for(i=0;i<n;i++)
    27             {
    28                 int nc;
    29                 scanf("%d",&nc);
    30                 t=1;
    31                 while(t<=nc)
    32                 {
    33                     v.push_back(t*a[i]);
    34                     nc-=t;
    35                     t=t*2;
    36                 }
    37                 if(nc>0){
    38                     v.push_back(nc*a[i]);
    39                 }
    40             }
    41
    42             //01背包求解过程
    43             memset(dp,0,sizeof(dp));
    44             dp[0]=1;
    45             int sum=0;
    46             for(i=0;i<v.size();i++)
    47             {
    48                 for(j=sum==m?m-v[i]:sum;j>=0;j--)  //这个用到优化j=sum==m?m-v[i]:sum,这个优化是必要的,不然TLE
    49                 {
    50                     if(dp[j]!=0&&j+v[i]<=m){
    51                         dp[j+v[i]]=1;
    52                     }
    53                 }
    54                 sum+=v[i];
    55                 if(sum>m)
    56                 {
    57                     sum=m;
    58                 }
    59             }
    60             int cnt=0;
    61             for(i=1;i<=m;i++)
    62             {
    63                 if(dp[i])
    64                 {
    65                     cnt++;
    66                 }
    67             }
    68             printf("%d\n",cnt);
    69         }
    70     return 0;
    71 }

转载于:https://www.cnblogs.com/crazyapple/p/3202179.html

noj [1480] 懒惰的风纪委Elaine (多重背包)相关推荐

  1. c++ 多重背包状态转移方程_【模板】各种背包问题amp;讲解

    [模板]各种背包问题&讲解  背包问题集合 一般来说,动态规划(DP)都是初学者最难闯过的一关,而在这里详细解说动态规划的一种经典题型:背包问题. 这里介绍的背包分为以下几种:01背包,完全背 ...

  2. 单调队列多重背包时间复杂度O(vn)

    版权声明:本文为博主原创文章,未经博主允许不得转载. 多重背包问题: 有N种物品和容量为V的背包,若第i种物品,容量为v[i],价值为w[i],共有n[i]件.怎样装才能使背包内的物品总价值最大? 网 ...

  3. 背包问题(多重背包+0-1背包)

    一:0-1背包问题 #include<iostream> #include<algorithm> #include<cstring> const int maxn= ...

  4. 背包模型dp1:01背包,完全背包,多重背包的两大优化的详解

    01背包问题: 状态表示:f[i][j]表示从只从前i个物体里面选,切总体积不超过j的选法的集合状态表示:f[i][j]表示从只从前i个物体里面选,切总体积不超过j的选法的集合状态表示:f[i][j] ...

  5. POJ 3260 多重背包+完全背包

    前几天刚回到家却发现家里没网线 && 路由器都被带走了,无奈之下只好铤而走险尝试蹭隔壁家的WiFi,不试不知道,一试吓一跳,用个手机软件简简单单就连上了,然后在浏览器输入192.168 ...

  6. hdu 3732(01背包转多重背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3732 思路:这么大的数据,用01背包肯定会TLE的,01背包转多重背包..最多也就11*11=121件 ...

  7. 动态规划 4、基础背包问题总结(多重背包与多重背包的转化)

    描述: 有N种物品和一个容量为V的背包.第i种物品最多有n[i]件可用,每件费用是c[i],价值是w[i].求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大. 变式:有的物品 ...

  8. 多重背包单调队列优化思路_多重背包之单调队列优化理论性总结

    多重背包之单调队列优化: 若用F[j]表示对容量为j的背包,处理完前i种物品后,背包内物品可达到的最大总价值,并记m = min(n, j / v).放入背包的第i种物品的数目可以是:0.1.2--, ...

  9. HDU 2079 选课时间(题目已修改,注意读题) 母函数 || 多重背包

    今天做这题才知道原来母函数的原型不是从第二个括号开始,那不过是优化而已,除了1^n,2^n那种类型可以从2开始外其他都要从1开始.好了,上代码吧. #include<stdio.h> in ...

  10. Lightoj 1231 - Coin Change (I) (裸裸的多重背包)

    题目链接: Lightoj  1231 - Coin Change (I) 题目描述: 就是有n种硬币,每种硬币有两个属性(价值,数目).问用给定的硬币组成K面值,有多少种方案? 解题思路: 赤果果的 ...

最新文章

  1. Visual Studio2005无法启动web调试的真正原因
  2. 图片预览组件PhotoView
  3. lvm 扩展根目录_Linux下lvm在线扩容步骤
  4. oracle中触发器只能用于表吗,Oracle触发器的分类和使用
  5. python程序的name属性作用是什么_python __name__ == ‘__main__’详细解释+例子
  6. new file会创建文件吗_Python处理文件—os模块
  7. OAuth2.0 授权码认证方式使用流程
  8. IntelliJ IDEA 中使用 Lambok (注解无效问题的解决)
  9. (已更新)漫画小程序更新修复接口,自动采集资源,漫画源码漫画小程序源码简单即可发布
  10. IDEA放大和缩小代码字体的快捷键设置
  11. ARM Cortex M3处理器概述
  12. 车联网也需要“走对路”,用户需求“导航”小度车载OS持续领先
  13. 给软件添加鼠标右键快捷方式
  14. 有关球 圆柱 圆锥 的计算
  15. SM敏捷实践经验总结
  16. Elasticsearch 同义词配置
  17. BI 不是可以拖拉拽取数吗?为什么还要 SQL 取数 ?
  18. 个人能力以外的资本都为0_能力之外的资本等于零--可是我们就缺这个零
  19. 关于黎曼猜想论文开头部分引用的欧拉公式
  20. SEO优化 - 使用nginx301重定向顶级域名到www二级域名

热门文章

  1. 计算机领域经典书籍推荐
  2. 老人步履蹒跚,警惕骨关节炎
  3. php 快递鸟 批量打印,电子面单批量打印接口简易手册(快递鸟)
  4. 从程序员到项目经理(二十八):该死的结果导向(只看结果,不问过程到底行不行?)
  5. 【PyQt5与Requests爬虫】设计图形界面(GUI)实现小说下载器-进度条显示
  6. xp系统怎么进pe修改计算机名,PE下安装原版XP系统装系统图文教程
  7. matplotlib之2010-2017年各季度国民生产总值散点图
  8. git强制拉取最新代码
  9. 思翼FM30高频头转发模式
  10. 多线程问题,实现三个线程顺序循环输出123123123...