精华内容
下载资源
问答
  • 用遗传算法实现二进制背包问题。 求解器的输入(KnapSackGA.java)是一个名为init.txt的文件,该文件的每一行包含以下内容: 项目数(例如7) 每个项目的值(以空格分隔)(例如1 2 3 4 5 6 7) 每个项目的重量...
  • 于是就有了二进制背包的方式 在多重背包中如果每个背包被选择的次数maxi都比较小 我们可以把他拆违maxi个相同的背包 但如果maxi可能比较大,那么最后的背包总数就可能会超时 怎么把这个maxi用一些更小的数字来组合而...

    之前有过一篇多重背包判断是否能凑一个整数的问题->传送门
    如果我们不是判断是否能凑成这个数,而是计算这个数内的背包最大值,就不能用这个写法了(也可能是我太菜了,一直WA)

    于是就有了二进制背包的方式

    在多重背包中如果每个背包被选择的次数maxi都比较小
    我们可以把他拆违maxi个相同的背包
    但如果maxi可能比较大,那么最后的背包总数就可能会超时
    怎么把这个maxi用一些更小的数字来组合而成呢?

    我们都知道,任意一个正整数都能被表示为二进制之和,而2的0次方即1可以表示任意一个数,所以如果在多重背包问题中我们知道每个背包能选择的最大次数maxi,我们就可以把maxi分解为二进制,把其中某些二进制数加起来就能得到小于等于maxi的任意一个数。

    如果没有理解,我们就看这个例子
    example:
    我们有个背包最多能被选择40次,也就是我们可以选择0到40次这个背包,而40=1+2+4+8+16+9,1、2、4、8、16、9这几个数就可以构成1到40中的任意一个数,我们如果不选择这个背包就是0。(!!!注意:一定是从2的0次方开始递增分解)
    P1833

    #include <bits/stdc++.h>
    using namespace std;
    int ans[1005];//all可能会很多,所以不能用二维的背包
    int t[10005];
    int score[10005];
    int c[10005];
    int a[1000005];
    int b[1000005];
    int all=0;
    int n;
    void transf()//转化背包
    {
        for(int i=1;i<=n;i++)
        {
            int tr=1;
            while(c[i])
            {
                a[++all]=tr*t[i];
                b[all]=tr*score[i];
                c[i]-=tr;
                tr*=2;
                if(c[i]<=tr)
                {
                    a[++all]=c[i]*t[i];
                    b[all]=c[i]*score[i];
                    break;
                }
            }
        }
    }
    int main()
    {
        int h1,m1,h2,m2;
        scanf("%d %*c%d%d%*c%d",&h1,&m1,&h2,&m2);
        cin >> n;
        for(int i=1;i<=n;i++)
        {
            cin >> t[i] >> score[i] >> c[i];
            if(!c[i])
                c[i]=100000;
        }
        transf();
        if(h2<h1)
            h2+=24;
        int T=(h2*60+m2)-(h1*60+m1);
        for(int i=1;i<=all;i++)
        {
            for(int j=T;j>=a[i];j--)
            {
                ans[j]=max(ans[j],ans[j-a[i]]+b[i]);
            }
        }
        cout << ans[T] << endl ;
        return 0;
    }
    
    
    展开全文
  • AcWing 5. 多重背包问题 II ...因为二进制最大是1,也就是只能用一次,背包问题同样也是,背包问题没搞明白的话,可以去看看以前的博文链接 所以代码就非常的简单了。 代码如下 #include<iostream> #inc

    AcWing 5. 多重背包问题 II

    在这里插入图片描述

    y总的视频

    最多能使用s次,我们就求出相应的二进制数
    把他拆分二进制,然后可以用这些一堆2i(1-cnt)来组合成0-s的数,
    在这里插入图片描述
    如果不能形成想象的二进制数,那我们就把最后的没能形成的作为一部分算进去。然后变成一个背包问题。
    可能到这一步你们还没有理解,比如说
    7的二进制数是111
    可以变成14+12+1*1
    因为二进制最大是1,也就是只能用一次,背包问题同样也是,背包问题没搞明白的话,可以去看看以前的博文链接
    所以代码就非常的简单了。
    代码如下

    #include<iostream>
    #include<algorithm>
    
    using namespace std;
    
    const int N=25000,M=2010;
    
    int cnt;
    int vi[N],wi[N],f[M];
    
    int n,m;
    
    int main(void)
    {
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++)
        {
            int v,w,s;
            scanf("%d%d%d",&v,&w,&s);
            int k=1;
            while(k<s)
            {
                cnt++;
                vi[cnt]=v*k;
                wi[cnt]=w*k;
                s-=k;
                k*=2;
            }
            if(s)
            {
                cnt++;
                vi[cnt]=v*s;
                wi[cnt]=w*s;
            }
        }
        for(int i=1;i<=cnt;i++)
        for(int j=m;j>=vi[i];j--)
        f[j]=max(f[j],f[j-vi[i]]+wi[i]);
        cout<<f[m];
    }
    
    展开全文
  • 1413权势二进制 题目来源:CodeForces 基准时间限制:1秒 空间限制:131072KB 一个十进制整数被叫做权势二进制,当他的十进制表示的时候只由0或1组成。例如0,1,101,110011都是权势二进制而2,12,900...
    题目来源:  CodeForces
    基准时间限制:1 秒 空间限制:131072 KB 

    一个十进制整数被叫做权势二进制,当他的十进制表示的时候只由0或1组成。例如0,1,101,110011都是权势二进制而2,12,900不是。

    当给定一个n的时候,计算一下最少要多少个权势二进制相加才能得到n。

    Input
    单组测试数据。
    第一行给出一个整数n (1<=n<=1,000,000)
    Output
    输出答案占一行。
    Input示例
    9
    Output示例
    9
    思路:完全背包刚刚装满背包;
    #include<bits/stdc++.h>
    using namespace std;
    #define ll long long
    #define pi (4*atan(1.0))
    #define eps 1e-14
    const int N=2e5+10,M=1e6+10,inf=1e9+10,mod=1e9+7;
    const ll INF=1e18+10;
    int a[N];
    int check(int x)
    {
        while(x)
        {
            if(x%10!=0&&x%10!=1)
                return 0;
            x/=10;
        }
        return 1;
    }
    int dp[M];
    int main()
    {
        int flag=0;
        for(int i=1;i<=1000000;i++)
            if(check(i))
            a[flag++]=i;
        int n;
        scanf("%d",&n);
        for(int i=0;i<=n;i++)
            dp[i]=inf;
        dp[0]=0;
        for(int i=0;i<flag;i++)
        {
            for(int t=a[i];t<=n;t++)
            {
                dp[t]=min(dp[t],dp[t-a[i]]+1);
            }
        }
        printf("%d\n",dp[n]);
        return 0;
    }

     

    转载于:https://www.cnblogs.com/jhz033/p/5998069.html

    展开全文
  • 为将烟花算法应用于离散优化领域并有效求解多维背包问题,构建一种二进制反向学习烟花算法。.首先,通过定义二进制字符串距离、二进制转置算子将烟花算法的爆炸算子、变异算子离散化,构建二进制烟花算.法;其次,...
  • #多重背包二进制优化 之前写过一个多重背包问题,其解法是把题目给出的物品全部拆成1个1个的,或者一次拿一个两个三个。接下来写一个多重背包二进制优化。 问题还是那个吧,毕竟难的我也不会。 悼念512汶川大...

    #多重背包之二进制优化
    之前写过一个多重背包的问题,其解法是把题目给出的物品全部拆成1个1个的,或者一次拿一个两个三个。接下来写一个多重背包的二进制优化。
    问题还是那个吧,毕竟难的我也不会。

    悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
    急!灾区的食物依然短缺!

    为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品,其价格不等,并且只能整袋购买。

    请问:你用有限的资金最多能采购多少公斤粮食呢?

    Input
    输入数据首先包含一个正整数C,表示有C组测试用例,每组测试用例的第一行是两个整数n和m(1<=n<=100, 1<=m<=100),分别表示经费的金额和大米的种类,然后是m行数据,每行包含3个数p,h和c(1<=p<=20,1<=h<=200,1<=c<=20),分别表示每袋的价格、每袋的重量以及对应种类大米的袋数。

    Output
    对于每组测试数据,请输出能够购买大米的最多重量,你可以假设经费买不光所有的大米,并且经费你可以不用完。每个实例的输出占一行。

    Sample Input
    1
    8 2
    2 100 4
    4 100 2

    Sample Output
    400

    对于这个样例,第一个组样例的4包米我们可以拆成1,2,1;比如我要拿三包米,那么我们可以拿一份1和一份2,要拿重量为2包的就可以直接拿一个2,其他的也是同理。

    接下来我们看一下AC代码

    #include<iostream>
    #include<queue>
    #include<string.h>
    #include<string>
    #include<stdio.h>
    #include<math.h>
    #include<algorithm>
    using namespace std;
    typedef long long ll;
    const int N=1e5+5;
    int p[N],h[N],dp[N];
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            memset(dp,0,sizeof(dp));
            int n,m;
            int pos=0;
            cin>>n>>m;
            for(int i=1;i<=m;i++)
            {
                int t=1;
                int a,b,c;
                cin>>a>>b>>c;
                while(c>=t)
                {
                    pos++;
                    p[pos]=a*t;
                    h[pos]=b*t;
                    c-=t;
                    t*=2;
                }
                pos++;
                p[pos]=a*c;
                h[pos]=b*c;
            }
            for(int i=1;i<=pos;i++)
            {
                for(int j=n;j>=p[i];j--)
                {
                    dp[j]=max(dp[j],dp[j-p[i]]+h[i]);
                }
            }
            cout<<dp[n]<<endl;
        }
    }

    这样就把多重背包优化成了01背包问题,而且时间复杂度要比之前那种抵。

    展开全文
  • A B C 给你N(N<=30)种水瓶每种水瓶有无限个 每个的体积是2^(i-1)价格是cost[i] 要求你花最少的钱弄出L体积的水 先从前到后扫一遍cost[i+1]=min...然后从0开始到30 如果二进制有当前体积的就买 同时检验一下an...
  • #1364 : 奖券兑换(二进制背包

    千次阅读 2018-03-26 21:32:21
    #1364 : 奖券兑换时间限制:20000ms单点时限:1000ms内存限制:256MB描述小Hi在游乐园中获得了M张奖券,这些奖券可以用来兑换奖品。可供兑换的奖品一共有N件。第i件奖品需要Wi张奖券才能兑换到,其价值是Pi。...
  • //多重背包二进制优化 //--------------------------------------------------------------------------- //01背包 void ZeroPack(int v, int w){ for(int j = M; j >= w; j--){ dp[j] = max(dp[j]...
  • 多重背包二进制优化问题

    千次阅读 2018-08-22 12:21:52
    二进制优化: 把第 i 种物品的 num【i】 分为 数个新的物品: 分配为: 1,2,4.....2^c (2^c &lt; num[ i ]) 剩下的数量都可以由这些二进制组合而成。 CODE(以51NOD1086为例): #include &lt;cstdio...
  • 思路:背包问题。dp[j]表示价值为j是否存在。 转移方程dp[j]|=dp[j-v[i]]; 坑:从sum/2 开始找,如果是奇数则先输出小再输出大。 代码: #include #include #include using namespace std; const ...
  • 多重背包是这样的一个问题: 有N种物品,第i种物品的体积为Ci,价值是Wi,但是每种物品的数量都是有限的,为ni。...我们可以考虑二进制的思想,将第i种物品拆分成若干件物品,可以有(Ci,Wi),(Ci×2,Wi×2),(Ci×
  • 背包问题二进制优化

    千次阅读 多人点赞 2016-01-25 19:45:49
    关于二进制优化这一点,它为什么正确,为什么合理,凭什么可以这样分,至少我是花了很久很久才理解的,先拿一道题来说吧。 HDU 2844 Coins 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2844 题目: ...
  • 利用改进的二进制狼群算法求解多维背包问题
  • 多重背包问题二进制优化)

    千次阅读 2020-10-29 16:51:24
    多重背包问题通常可转化成01背包问题求解。但若将每种物品的数量拆分成多个1的话,时间复杂度会很高,从而导致TLE。所以,需要利用二进制优化思想。即: 一个正整数n,可以被分解成1,2,4,…,2^(k-1),n-2^k+1的形式。...
  • 完全背包问题是指 有N种物品和一个容量为V的背包,每一种物品都是有无限的个数。也就是从每种物品角度分析,与其相关的策略不是选不选的问题了 已经转换为选多少个的问题了  其实说到这里你难道不觉得有点像DAG图...
  • 题目链接:51Nod 1086 背包问题 V2问题描述: 有N种物品,每种物品的数量为C1,C2……Cn。从中任选若干件放在容量为W的背包里,每种物品的体积为W1,W2……Wn(Wi为整数),与之相对应的价值为P1,P2……Pn(Pi为...
  • 提出一种处理高维背包问题(KP) 的贪婪封装二进制差分进化算法(GPBDE), 并设计了一种贪婪封装的修补策略处理不可行解. 为了提高种群的多样性及算法的全局搜索能力, 对适应度较低的个体执行对偶变换. 数值实验选取4 种...
  • 讲述 离散二进制原理 ,以背包问题具体讲解离散二进制粒子群。代码语言:python、MATLAB。
  • 二进制优化多重背包

    2019-07-15 19:02:16
    二进制优化多重背包 ∙\bullet∙题目:Marsha and Bill own a collection of marbles. They want to split the collection among themselves so that both receive an equal share of the marbles. This would be ...
  • 如果不使用二进制优化,当数据量变得很大的时候会出现超时的问题。 怎样使用二进制优化? 此处贴一段代码,感谢原作者,我稍微改了一下代码风格 for (int i = 0; i < A.size(); ++i){ int j = 1; while(j * A[i...
  • 针对0-1 背包问题, 提出一种二进制修正和声搜索算法. 该算法修正了即兴创作过程, 对参数PAR进行动态调整, 同时提出一种随机修复机制, 有效修复不可行的和声, 增强算法的局部搜索. 采用一种可行和声初始化方式, 保证...
  • Q:所谓将num拆分成k个二进制数,那么为什么这些二进制数可以表示1~num的任意一个数? A:同拆分成num个01背包一样,它的原理是由num个1,每一个代表一个物体,用这些物体来表示num个物体的情况。那拆分成k个二进制数...
  • 二进制Dragonyy算法求解0-1背包问题
  • 背包问题二进制优化详解

    千次阅读 2019-02-25 21:04:16
    背包问题二进制优化详解 以POJ1276为例,说一下二进制优化的详细思路,首先贴题 Description A Bank plans to install a machine for cash withdrawal. The machine is able to deliver appropriate @ bills for a...
  • #include<iostream> #include<vector> using namespace std; int n,m; const int N=2010; int f[N]; int v[N],w[N],s[N]; struct Thing { int v,w; }; vector<...int main(...
  • 二进制蝙蝠算法用于解决背包问题算法流程背包问题Matlab 代码目标函数仿真结果参考文献 算法流程 背包问题 参考[Matlab] 离散二进制粒子群算法(BPSO )解决背包问题 Matlab 代码 %% 二进制蝙蝠算法 %初始化种群...
  • 多重背包 II 题目链接 题目描述 有 N 种物品和一个容量是 V 的背包。 第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。 求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。 输出最大...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,437
精华内容 5,374
关键字:

二进制背包问题