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. bzoj1090 字符串折叠

    问题描述 折叠的定义如下: 1. 一个字符串可以看成它自身的折叠.记作S  S 2. X(S)是X(X>1)个S连接在一起的串的折叠.记作X(S)  SSSS…S(X个S). 3. 如果A ...

  2. UVA-11134 Fabled Rooks 贪心问题(区间贪心)

    题目链接:https://cn.vjudge.net/problem/UVA-11134 题意 在 n*n 的棋盘上,放上 n 个车(ju).使得这 n 个车互相不攻击,即任意两个车不在同一行.同一列 ...

  3. HTML标签和文档结构

    HTML标签与文档结构 HTML作为一门标记语言,是通过各种各样的标签来标记网页内容的.我们学习HTML主要就是学习的HTML标签. 那什么是标签呢? #1.在HTML中规定标签使用英文的的尖括号即` ...

  4. [HNOI2004]高精度开根

    题目:洛谷P2293.BZOJ1213. 题目大意:给你$n,k(n\leq 10^{10000},k\leq 50)$,求$\lfloor \sqrt[k]{n}\rfloor$. 解题思路:高精度 ...

  5. django orm 时间处理

    说明  datetime 类型赋值: 数据库设置时区为:utc 系统设置时区为:'Asia/Shanghai' 1.赋值为:‘2019-04-24 15:00:00’      数据库的结果为   ‘ ...

  6. 现在有一个函数A和函数B,请你实现B继承A

    现在有一个函数A和函数B,请你实现B继承A // 方式1 function B(){} function A(){} B.prototype = new A(); // 方式2 function A( ...

  7. Bloxorz I (poj 3322 水bfs)

    Language: Default Bloxorz I Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 5443   Acce ...

  8. 利用opencv源代码和vs编程序训练分类器haartraining.cpp

    如需转载请注明本博网址:http://blog.csdn.net/ding977921830/article/details/47733363. 一  训练框架 训练人脸检測分类器须要三个步骤: (1 ...

  9. 2.AngularJS-验证

    转自:https://www.cnblogs.com/best/p/6225621.html 一.验证 angularJS中提供了许多的验证指令,可以轻松的实现验证,只需要在表单元素上添加相应的ng属 ...

  10. jquery easyui 输入框 禁止输入负数 设置属性data-options="min:0,required:true"

    jquery easyui  输入框 禁止输入负数  设置属性data-options="min:0,required:true" <input id="days& ...