0/1背包总结(持续更新...)

数字分组问题

Problem 1:给定n个物品,将它们分成两堆,使他们的质量之差最小,求这个最小值

poj 2311

Sol:差最小是0,此时分成的两堆的质量都是sum/2,因此让背包的总容量为sum/2,就是让某一堆尽量接近sum/2,此时两堆的差最小

Code:

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<map>
using namespace std;

int m,n;
int col;
map<string,int>mch;
int v[15][110],sum[15];
int f[500*1010];

int main(){
    scanf("%d%d",&m,&n);
    while(n&&m){
        col=0;//memset(mch,0,sizeof(mch));
        mch.clear();
        memset(v,0,sizeof(v));
        memset(sum,0,sizeof(sum));
        string s;
        for(int i=1;i<=m;++i){
            cin>>s;
            mch[s]=++col;
            s.clear();
        }
        int x;
        for(int i=1;i<=n;++i){
            scanf("%d",&x);cin>>s;
            v[mch[s]][++v[mch[s]][0]]=x;
            sum[mch[s]]+=x;
            s.clear();
        }
        int ans=0;
        for(int t=1;t<=col;++t){
            memset(f,0,sizeof(f));
            for(int i=1;i<=v[t][0];++i)
                for(int j=sum[t]/2;j>=v[t][i];--j)
                    f[j]=max(f[j],f[j-v[t][i]]+v[t][i]);
            ans+=sum[t]-f[sum[t]/2];
        }
        printf("%d\n",ans);
        scanf("%d%d",&m,&n);
    }
    return 0;
}

Problem 2:给定n个物品,将它们分成两堆,使他们的质量之差最大,但不能超过这些物品中最大的质量

没找到题,求资源

Sol:相差最大时,两堆物品的质量分别是(sum+max)/2,(sum-max)/2,因此让背包容量为(sum+max)/2即可

Code:

 1 #include<cstring>
 2 #include<cstdio>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6
 7 int n,m,mx=-0x3f3f3f3f,sum;
 8 int a[30];
 9 bool f[20*100010];
10
11 int main(){
12     scanf("%d",&n);
13     for(int i=1;i<=n;++i) scanf("%d",&a[i]),sum+=a[i],mx=max(mx,a[i]);
14     m=(sum+mx)/2;
15     f[0]=1;
16     for(int i=1;i<=n;++i)
17         for(int j=m;j>=a[i];--j)
18             f[j]|=f[j-a[i]];
19     for(int i=(sum-mx)/2;i<=sum/2;++i)
20         if(f[i]&&f[sum-i]){
21             cout<<sum-2*i;return 0;
22         }
23     return 0;
24 }
25
26
27 /*
28 5
29 2 4 5 8 10
30 */

时间: 2024-09-30 21:57:38

0/1背包总结(持续更新...)的相关文章

个人专题训练——背包dp(持续更新中)

A - Proud Merchants   HDU - 3466(带限制的01背包) 题意: 给你m元,去买大米,每袋大米给你p,q,v 当你手中的钱 >= q时,才能买价格为p的这袋大米,它的价值是v,求最大价值. 01背包的转移方程根据题意很容易写出来,但是会有问题. for (int i = 1; i <= n; ++i) for (int j = m; j >= q[i]; --j) dp[j] = max(dp[j], dp[j - p[i]] + v[i]);考虑到了可能存在

Visual Studio 2015 &amp; C#6.0 试用报告,持续更新。

昨天早上看到了.net开源的消息,我是非常兴奋的,毕竟局限于Windows的.NET经常被人唾弃.VB暂且不提,C#常年被人指责跨平台性不佳,我也是无能为力.即使有Mono等第三方跨平台工程,.NET的跨平台性还是不尽人意. 看到了.NET开源的消息后,又看见了Visual Studio 2015,让我没想到的是,VS居然已经集成了跨平台开发,这令我十分意外,如此保守和唾弃Android.Linux的微软,居然肯在自家的VS上集成其他平台的开发.... 我对Android的了解还不是很深,只停留

自己总结的 iOS ,Mac 开源项目以及库,知识点------持续更新

自己在 git  上看到一个非常好的总结的东西,但是呢, fork  了几次,就是 fork  不到我的 git 上,干脆复制进去,但是,也是认真去每一个每一个去认真看了,并且也是补充了一些,感觉非常棒,所以好东西要分享,为啥用 CN 博客,有个好处,可以随时修改,可以持续更新,不用每次都要再发表,感觉这样棒棒的 我们 自己总结的iOS.mac开源项目及库,持续更新.... github排名 https://github.com/trending,github搜索:https://github.

转-推荐的几个开发常用在线工具,可以提升开发效率(持续更新)

http://blog.csdn.net/kroclin/article/details/40634975 相信开发中每个人手头上面都有那么几个工具可以让你每天洋洋得意的开发软件,而这里我就将我觉得还挺不错的几款在线工具分享出来,仁者见仁啦,喜欢就拿走.还会持续更新,以后有新的我都贴上来. 1.MD5解密:http://www.cmd5.com/ 2.MD5加密:http://md5jiami.51240.com/ 3.json在线解析工具:http://json.parser.online.f

linux学习资料持续更新中

一.LINUX基础教程 1.老男孩系列免费视频: 1) linux高薪入门实战视频教程(第二部)老男孩linux教程 http://edu.51cto.com/course/course_id-1035-page-1.html 2) 跟着老男孩从0开始一步步实战深入学习linux运维(三) http://edu.51cto.com/lesson/id-11909.html linux学习资料持续更新中,布布扣,bubuko.com

Linux系统各发行版镜像下载(持续更新)

Linux系统各发行版镜像下载(持续更新) http://www.linuxidc.com/Linux/2007-09/7399.htm Linux系统各发行版镜像下载(2014年10月更新),如果直接下载不了,请使用迅雷下载.并且注意,我的下载地址,在  迅雷 里才起作用. 包括Ubuntu,Fedora,SUSE,Red Hat Enterprise Linux,CentOS等. 中国大陆开源镜像站汇总 1.企业贡献: 搜狐开源镜像站:http://mirrors.sohu.com/网易开源

MongoDB学习——持续更新

參考MongoDB权威指南,学习阶段.大家多多交流问题.持续更新本文 MongoDB的长处 MongoDB具有丰富的数据模型,是面向文档的数据库. easy扩展.能够在多台server之间切割数据. 开发人员仅仅需专注于编写应用.假设须要更大的数据.仅仅需在集群中加入新机器,然后让数据库来处理剩下的事情. 具有丰富的功能,比方索引,存储JavaScript,聚合,固定集合.文件存储. 不支持联接(join)和复杂的多行事物. 卓越的性能是MongoDB的主要目标,默认的存储引擎使用了内存映射文件

C#、Java中的一些小功能点总结(持续更新......)

前言:在项目中,有时候一些小的功能点,总是容易让人忽略,但是这些功能加在项目中往往十分的有用,因此笔者在这里总结项目中遇到的一些实用的小功能点,以备用,并持续更新...... 1.禁用DataGridView表头的排序功能 1 /// <summary> 2 /// 禁止点击列表头进行排序 3 /// </summary> 4 /// <param name="dgv">当前DataGridView控件</param> 5 private

【20160612-20160618】记一周省常中训练(持续更新,欢迎催更)

挖坑,持续更新. #include <cstdio> using namespace std; int main(){ puts("转载请注明出处:http://www.cnblogs.com/wangyurzee7/"); puts("谢谢您的配合"); puts("by wangyurzee7"); return 0; } 20160611下午大概3点不到下火车,打车去宾馆.去学校转了一圈,在宾馆旁边吃了个晚饭,然后赶回去打计蒜之

(转)iOS开发——来改掉那些被禁用的方法吧(持续更新中)

iOS平台在快速的发展,各种接口正在不断的更新.随着iOS9的发布,又有一批老方法不推荐使用了,你若调用这些方法,运行的结果是没有问题的,但是会出现警告“***is deprecated :first deprecated in iOS 9.0 - Use *******”.就像如图所示: 在实际项目开发中,我们要秉承一个信念就是:要把每一个警告当做错误来处理,并解决每一个警告.你想想,你运行一个项目,就算运行成功了,但是出现几十个.甚至几百个黄黄的警告,心情是不是很糟糕呢?我将在这篇博客结合我