POJ 1742 Coins ( 单调队列解法 )「建议收藏」

POJ 1742 Coins ( 单调队列解法 )

大家好,又见面了,我是全栈君。

博客

再加上这题体积与价值相等那么就更好做了。仅仅有 j %v[ i ] 余数同样的才干够同一时候处理(j 指的是某个体积的值),在计算某个数的时候,仅仅要计算前面的同样的余数中(在个数限制内)是否有 true(有放满的) 就能够了。

代码:

#include<iostream>
#include<sstream>
#include<map>
#include<cmath>
#include<fstream>
#include<queue>
#include<vector>
#include<sstream>
#include<cstring>
#include<cstdio>
#include<stack>
#include<bitset>
#include<ctime>
#include<string>
#include<cctype>
#include<iomanip>
#include<algorithm>
using namespace std  ;
#define INT long long int
#define L(x)  (x * 2)
#define R(x)  (x * 2 + 1)
const int INF = 0x3f3f3f3f ;
const double esp = 0.0000000001 ;
const double PI = acos(-1.0) ;
const int mod = 1000000007 ;
const int MY = (1<<5) + 5 ;
const int MX = 100010 + 5 ;
int n ,W ,ans ;
int v[MX] ,num[MX] ;
bool deq[MX] ,dp[MX] ;
void input()
{
    memset(dp ,false ,sizeof(dp)) ;
    for(int i = 1 ;i <= n ; ++i)
        scanf("%d" ,&v[i]) ;
    for(int i = 1 ;i <= n ; ++i)
        scanf("%d" ,&num[i]) ;
}
void DP(int v ,int num)
{
    if(!num || !v)  return ;
    if(num == 1) // 01 背包
    {
        for(int i = W ;i >= v ; --i)
           if(!dp[i] && dp[i-v])
               dp[i] = true ,ans++ ;
    }
    else if(num * v >= W) // 全然背包
    {
        for(int i = v ;i <= W ; ++i)
          if(!dp[i] && dp[i-v])
              dp[i] = true ,ans++ ;
    }
    else
    {
        num = min(num ,W/v) ;
        for(int a = 0 ;a < v ; ++a)  // 同样余数一块处理
        {
            int front =0 ,end = 0 ,sum = 0 ;
            for(int j = a ;j <= W ; j += v)
            {
                if(end - front-1 == num)  // 去除过时元素 ,由于最多选择num[i] 个
                    sum -= deq[front++] ;
                deq[end++] = dp[j] ;  // 存入
                sum += dp[j] ;
                if(!dp[j] && sum)
                    dp[j] = true ,ans++ ;

            }
        }
    }
}
int main()
{
    //freopen("input.txt" ,"r" ,stdin) ;
    while(scanf("%d%d" ,&n ,&W) ,n+W)
    {
        input() ;
        dp[0] = true ;
        ans = 0 ;
        for(int i = 1 ;i <= n ; ++i)
             DP(v[i] ,num[i]) ;
        printf("%d\n" ,ans) ;
    }
    return 0 ;
}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/116515.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 提升网站权重的方法_怎么快速提升网站权重到4

    提升网站权重的方法_怎么快速提升网站权重到4SEO权重是各大搜索引擎给予网站赋予的评估或评价等级,代表着网站在某领域中的权威性、健康度及成长潜力,网站的权重越高一方面代表其越具权威性,另一方面也代表着搜索引擎对其友好度越强,会在排名、流量和信任度评价给予较好的扶持。权重是一个相对性的概念,即根据某既定指标的整体评价中相对的重要程度。如果用容易理解的方法来说,比如指数是量级统计数据,那么权重便是性质评估数据,互联网平台普遍存在指数和权重相关体系化的数据管理。一、SEO权重与网站的关系1.百度权重是第三方推出,收录与其没直接联系.

    2022年10月6日
    1
  • ceph常用命令详解_ceph osd

    ceph常用命令详解_ceph osd1.OSD概念OSD:ObjectStorageDevice,主要负责响应客户端请求返回具体数据的守护进程,一般一个集群会有多个OSD,每一块盘都会对应一个OSD。2.OSD状态[root@data1~]#cephosdstat4osds:3up(since23m),3in(since13m);epoch:e345OSD状态说明:a.集群内(in)b.集群外(out)c.活着且在运行(up)d.挂了且不再运行(down).

    2025年6月29日
    0
  • modelsim教程

    modelsim教程TheTutorialof Modelsim小狼@http://blog.csdn.net/xiaolangyangyang一、建立库vlibwork(库名)二、映射库到物理目录vmapwork(映射的逻辑名称)work(存放的物理地址)三、编译源代码vlog../src/MUX_4_8.vvlog../src/MU

    2022年10月22日
    1
  • xplanner-0.7b7b 部署问题解决

    xplanner-0.7b7b 部署问题解决

    2021年5月7日
    113
  • 锁文件夹怎么锁_密码锁有没有开锁记录

    锁文件夹怎么锁_密码锁有没有开锁记录1.文件锁可以对将要修改文件的某个部分进行加锁,精确控制到字节通过fcntl()函数来进行设置文件锁fcntl(intfd,intcmd,………);参数:fd:文件描述符cmd

    2022年8月5日
    6
  • 大数据应用管理模式及内容

    大数据应用管理模式及内容通过调研,数据应用管理可总结为分散管理型、职能复用型、集中管理型三种模式,数据应用管理模式中重点关注组织管理、需求管理、建设管理、成果管理四大领域。(1)管理模式分散管理型:各部门分散开展数据应用,无集中管理,例如某某国有集团,公司各业务部门均设有业务数据部门,开展本部门数据应用相关事务。职能复用型:赋予现有部门数据应用管理职责,集中开展数据应用局部过程的管理事务,例如某工业公司,依托公司…

    2022年6月9日
    32

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号