void solve(int v,int w,int c)
{
    int count=0;
    for(int k=1;k<=c;k<<=1)
    {
        val[count]=k*v;
        size[count++]=k*w;
        c-=k;    
    }
    if(c>0)
    {
        val[count]=c*v;
        size[count++]=c*w;
    }
    for(int i=0;i<count;i++)
    {
        cout<<val[i]<<"  "<<size[i]<<endl;
    }
}

多重转为01模版

hdu 3732

思路:因为v,w都是0到10的数 ,所以会有很多v和w重复,把他们统计出数量,弄成多重背包,然后二进制优化,转为01

#include <string>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <iostream>
using namespace std;
int cnt;
int v[100005];
int w[100005];
int dp[10005];
int n,m;
void change(int a,int b,int c)
{
    int k=1;
    for(k=1;k<=c;k<<=1)
    {
        /*v[cnt]=k*a;
        w[cnt++]=k*b;*/
        for(int j=m;j>=k*b;j--)
        {
            dp[j]=max(dp[j],dp[j-k*b]+k*a);
        }
        c-=k;
    }
    if(c>0)
    {
        /*v[cnt]=k*a;
        w[cnt++]=k*b;*/
        for(int j=m;j>=c*b;j--)
        {
            dp[j]=max(dp[j],dp[j-c*b]+c*a);
        }
    }
    return;
}
int main()
{
    int a,b;
    int map[11][11];
    char s[1005];
    while(~scanf("%d %d",&n,&m))//记得加~或者EOF 不然你怎么优化都是超时
    {
        memset(map,0,sizeof(map));
        memset(dp,0,sizeof(dp));
        cnt=0;
        for(int i=0;i<n;i++)
        {
            scanf("%s %d %d",&s,&a,&b);
            getchar();
            map[a][b]++;
        }
        for(int i=1;i<11;i++)
        {
            for(int j=1;j<11;j++)
            {
                if(map[i][j]>0)
                {
                    int k=1;
                    int c=map[i][j];
                    for(k=1;k<=c;k<<=1)
                    {
                        /*v[cnt]=k*a;
                        w[cnt++]=k*b;*/
                        for(int s=m;s>=k*j;s--)
                        {
                            dp[s]=max(dp[s],dp[s-k*j]+k*i);
                        }
                        c-=k;
                    }
                    if(c>0)
                    {
                        /*v[cnt]=k*a;
                        w[cnt++]=k*b;*/
                        for(int s=m;s>=c*j;s--)
                        {
                            dp[s]=max(dp[s],dp[s-c*j]+c*i);
                        }
                    }
                }
            }
        }
        /*for(int i=0;i<cnt;i++)
        {
            for(int j=m;j>=w[i];j--)
            {
                dp[j]=max(dp[j],dp[j-w[i]]+v[i]);
            }
        }*/
        printf("%d\n",dp[m]);
    }
    return 0;
}

dp之多重背包(二进制优化)的更多相关文章

  1. hdu1059 dp(多重背包二进制优化)

    hdu1059 题意,现在有价值为1.2.3.4.5.6的石头若干块,块数已知,问能否将这些石头分成两堆,且两堆价值相等. 很显然,愚蠢的我一开始并想不到什么多重背包二进制优化```因为我连听都没有听 ...

  2. HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化)

    HDOJ(HDU).2844 Coins (DP 多重背包+二进制优化) 题意分析 先把每种硬币按照二进制拆分好,然后做01背包即可.需要注意的是本题只需要求解可以凑出几种金钱的价格,而不需要输出种数 ...

  3. HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化)

    HDOJ(HDU).1059 Dividing(DP 多重背包+二进制优化) 题意分析 给出一系列的石头的数量,然后问石头能否被平分成为价值相等的2份.首先可以确定的是如果石头的价值总和为奇数的话,那 ...

  4. HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化)

    HDOJ(HDU).2191. 悼念512汶川大地震遇难同胞――珍惜现在,感恩生活 (DP 多重背包+二进制优化) 题意分析 首先C表示测试数据的组数,然后给出经费的金额和大米的种类.接着是每袋大米的 ...

  5. BZOJ.3425.[POI2013]Polarization(DP 多重背包 二进制优化)

    BZOJ 洛谷 最小可到达点对数自然是把一条路径上的边不断反向,也就是黑白染色后都由黑点指向白点.这样答案就是\(n-1\). 最大可到达点对数,容易想到找一个点\(a\),然后将其子树分为两部分\( ...

  6. hdu 2191 (多重背包+二进制优化)

    Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...

  7. Coins(多重背包+二进制优化)

    Problem Description Whuacmers use coins.They have coins of value A1,A2,A3...An Silverland dollar. On ...

  8. Cash Machine POJ - 1276 多重背包二进制优化

    题意:多重背包模型  n种物品 每个m个  问背包容量下最多拿多少 这里要用二进制优化不然会超时 #include<iostream> #include<cstdio> #in ...

  9. HDU 5445 Food Problem(多重背包+二进制优化)

    http://acm.hdu.edu.cn/showproblem.php?pid=5445 题意:现在你要为运动会提供食物,总共需要提供P能量的食物,现在有n种食物,每种食物能提供 t 能量,体积为 ...

  10. POJ-1276 Cash Machine 多重背包 二进制优化

    题目链接:https://cn.vjudge.net/problem/POJ-1276 题意 懒得写了自己去看好了,困了赶紧写完这个回宿舍睡觉,明早还要考试. 思路 多重背包的二进制优化. 思路是将n ...

随机推荐

  1. affe(8) solver 优化方法

    上文提到,到目前为止,caffe总共提供了六种优化方法: Stochastic Gradient Descent (type: "SGD"), AdaDelta (type: &q ...

  2. NodeJS学习笔记 (17)集群-cluster(ok)

    cluster模块概览 node实例是单线程作业的.在服务端编程中,通常会创建多个node实例来处理客户端的请求,以此提升系统的吞吐率.对这样多个node实例,我们称之为cluster(集群). 借助 ...

  3. luogu-1908 逆序对 离散化+树状数组

    题目链接:https://www.luogu.org/problem/show?pid=P1908 题意 简单的求逆序对 思路 用树状数组来做逆序对 对于过大的数字来讲,用离散化处理即可 比赛的时候没 ...

  4. 紫书 例题 10-22 UVa 1640(数位统计)

    这道题的题解有几个亮点 一个是每次只统计一个数字来简化思维 一个是统计当前位数的时候分三个部分来更新答案 具体看代码,有注释 #include<cstdio> #include<cs ...

  5. 二 MapReduce 各阶段流程分析

    如果想要将问题变得清晰.精准和优雅, 需要关注 MapReduce 作业所需要的系统资源,尤其是集群内部网络资源使用情况. MR 可以运行在共享集群上处理 TB 级 甚至 PB 级的数据.同时,改作业 ...

  6. Oracle运行set autotrace on报错SP2-0618、SP2-0611

    SQL> set autotrace on SP2-0618: 无法找到会话标识符.启用检查 PLUSTRACE 角色 SP2-0611: 启用 STATISTICS 报告时出错 原因: PLU ...

  7. ArcGIS api for javascript——地理处理任务-瓶中信

    描述 如果在海洋中丢下一个瓶子,本例使用颗粒追踪模型显示指定的天数后瓶子在的地方.首先,输入一个追踪瓶子的天数.然后单击按钮并在海洋里的任意地方画一个点来开始模型.几秒以后将看到一条线出现描述瓶子将去 ...

  8. linux设备驱动归纳总结(三):4.ioctl的实现

    linux设备驱动归纳总结(三):4.ioctl的实现 一.ioctl的简单介绍: 尽管在文件操作结构体"struct file_operations"中有非常多相应的设备操作函数 ...

  9. vue20 父子组件数据交互

    子组件使用父组件数据 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&quo ...

  10. 10.ng-class-even与ng-class-odd

    转自:https://www.cnblogs.com/best/tag/Angular/ AngularJS模板使你可以把该作用域内的数据直接绑定到所显示的HTML元素 ng-class-even与n ...