View Code

//hdu 1171 dp(多重背包)//题意:把所有物品的价值尽量分为相等的两份,不能等分的话
//后面那份可以稍小于前面的
//求出价值总和后,令价值的一半为背包容量,让背包尽可能的装满

#include <stdio.h>
#include <string.h>//最多50种,每种最多100个,每个价值最大50
//所以所有物品总价值为250000,我们只要dp一半就可以了
#define N 130000
#define M 55int tot_n;
int val[M], num[M];
bool dp[N];int main()
{while(scanf("%d", &tot_n), tot_n >= 0){int sum_v = 0;memset(dp, false, sizeof(dp));for(int i = 0; i < tot_n; ++i){scanf("%d%d", &val[i], &num[i]);sum_v += val[i] * num[i];}int half = sum_v / 2;dp[0] = true;for(int i = 0; i < tot_n; ++i){   //j 要从后往前,若从0开始,i=0 时(即第i中物品时),在s循环中,//val[i]*s = 10, j = 0的话,val[10] 就会为true,当j 等于10时 又把i种物品放一次//但 dp[10] 本应该是 false 的//若j 从大到小,比如 j = 10时 dp为true,然后放入 val[i]=10 的物品,则标记val[10+10]=true//意思是 容纳的质量为 10 时放入 质量为 10 的物品,则容纳的质量可达到20,则标记为true//标记的是 j 的后面,而j 时递减的,所以不会影响到 dp[j] == true这个判断if(half - val[i] >= 0)  //没有这个判断就会超时,也不知道为什么{                       //for 的判断应该就会判断了,但他就是超时了,无语for(int j = half - val[i]; j >= 0; --j)  //表示背包已经装有 j 的容量
                {if(dp[j] == true){   //s记录i中器材的数量for(int s = 1; s <= num[i] && val[i]*s + j <= half; s++)dp[ val[i]*s + j ] = true;}}}}int i;for(i = half; i >= 0; --i)  //找背包尽可能装满的大小if(dp[i] == true)break;printf("%d %d\n", sum_v - i, i);}return 0;
}

转载于:https://www.cnblogs.com/gabo/archive/2012/04/15/2450216.html

hdu 1171 dp(多重背包)相关推荐

  1. HDU 2844 Coins 多重背包

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=2844 Coins Time Limit: 2000/1000 MS (Java/Others)Mem ...

  2. HDU - 2844 Coins(多重背包+完全背包)

    题意 给n个币的价值和其数量,问能组合成\(1-m\)中多少个不同的值. 分析 对\(c[i]*a[i]>=m\)的币,相当于完全背包:\(c[i]*a[i]<m\)的币则是多重背包,考虑 ...

  3. POJ 1742 Coins ( 经典多重部分和问题 DP || 多重背包 )

    题意 : 有 n 种面额的硬币,给出各种面额硬币的数量和和面额数,求最多能搭配出几种不超过 m 的金额? 分析 : 这题可用多重背包来解,但这里不讨论这种做法. 如果之前有接触过背包DP的可以自然想到 ...

  4. (step3.3) hdu 1059(Dividing——多重背包)

    题目大意:分别给出价值为1~6的石头的数量.问能否将这些石头等价值平分... 解题思路:多重背包 1)多重背包的典型描述是这样的:给出n种物品,背包的容量为V.每种物品的可用数量为num[i],所占体 ...

  5. 【dp - 多重背包】575: Coin Changing

    题目: http://acm.swust.edu.cn/#/problem/575/490 题目描述 设有n 种不同面值的硬币,各硬币的面值存于数组T[1:n]中.现要用这些面值的硬币来找钱.可以使用 ...

  6. HDU 2844 Coins (多重背包)

    题目链接 题意:Tony想要买一个东西,他只有n种硬币,每种硬币的面值为a[i],每种硬币的数量为c[i],要买的物品价值不超过m,输出1-m中有多少种价格Tony可以用硬币组合出来. 题解:多重背包 ...

  7. HDU 1059 Dividing 多重背包

    这题想了想用母函数应该也可以做,不过得考虑一个细节,就是加起来的总和是否为奇数,我找了好久一直没找出错误,原来是没考虑奇数..  fuck  这种问题我怎么能不考虑奇数呢.....  啊 啊 啊啊 啊 ...

  8. Piggy-Bank HDU - 1114(多重背包)

    在 ACM 能够开展之前,必须准备预算,并获得必要的财力支持.该活动的主要收入来自于 Irreversibly Bound Money (IBM).思路很简单.任何时候,某位 ACM 会员有少量的钱时 ...

  9. hdu 3732(01背包转多重背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3732 思路:这么大的数据,用01背包肯定会TLE的,01背包转多重背包..最多也就11*11=121件 ...

最新文章

  1. vcm驱动芯片原理_T6322A|电源芯片的内部设计是怎样的?
  2. PHP Liunx 服务安全防范方案
  3. linux rar工具
  4. python-time.time()
  5. 实验吧—部分MISC Write up
  6. 腾讯机智在GTC 2019
  7. ug11 linux,UG11.0升级包MP02Win#Linux系统下载就上UG网
  8. oracle sh文件怎么打开,Oracle数据库逻辑备份的SH文件
  9. 仿英雄联盟比赛直播网页模板
  10. 女生做产品经理好吗_产品经理如何做产品架构设计
  11. AntiXSS v4.0中Sanitizer.GetSafeHtmlFragment等方法将部分汉字编码为乱码的解决方案
  12. VScode Python no module的解决方法
  13. Atitit json数据查询法 jsonpath 目录 1.1. 1.概述 1 1.2. 3.2。经营者特殊符号 1 1.3. # JSONPath expressions 2 1.4. Xpa
  14. 列举在100到200以内的质数
  15. iOS iPhone X底部设置高度 白色底部显示
  16. Docker从基础到企业生产应用学习笔记大总结
  17. 如何通过域名访问服务器文件,如何通过域名访问云服务器
  18. 2048android源代码,VasSonic Android源码解析
  19. 1688店铺所有商品API接口(整店商品查询API接口)
  20. 百度 Hydra 工具在移动端 UI 兼容性测试上的高效应用

热门文章

  1. 字符串常量与字符数组的区别和字符串常量易错点
  2. 日志不说谎--Asp.net的生命周期
  3. Javascript的对象继承方法
  4. 利用firebug动态加载online js文件
  5. css模拟select设置高度在ie67下有效(也可作为去除边框)
  6. iPhone 5的发布日期估计为9月21日挂
  7. 30天敏捷结果(15):让自己处于宁静状态
  8. asp ado 连接测试_ASP.NET Core 简介
  9. 【汇编优化】之arm32汇编优化
  10. Java-虚拟机-垃圾收集器/垃圾收集算法/GCROOT根