悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 HDU 2191

一道裸的多重背包问题:

 #include<iostream>
#include<algorithm>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[],a[],b[],c[];
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&m,&n);
for(int i=;i<n;i++)
scanf("%d%d%d",&a[i],&b[i],&c[i]);
memset(dp,,sizeof(dp));
for(int i=;i<n;i++)
for(int j=1;j<=c[i];j++)
for(int k=m;k>=a[i];k--)
if(dp[k]<dp[k-a[i]]+b[i])
dp[k]=dp[k-a[i]]+b[i];
printf("%d\n",dp[m]);
}
return ;
}

对于多重背包,可以用二进制来优化!

摘自:二级制分解思想详解

 在这之前,我空间好像转过一个背包九讲,现在我就只对
01背包和多重背包有点印象了 先说下 背包,有n 种不同的物品,每个物品有两个属性
size 体积,value 价值,现在给一个容量为 w 的背包,问
最多可带走多少价值的物品。 int f[w+]; //f[x] 表示背包容量为x 时的最大价值
for (int i=; i<n; i++)
for (int j=w; j>=size[i]; j++)
f[j] = max(f[j], f[j-size[i]]+value[i]); 如果物品不计件数,就是每个物品不只一件的话,稍微改下即可
for (int i=; i<n; i++)
for (int j=size[i]; j<=w; j++)
f[j] = max(f[j], f[j-size[i]]+value[i]); f[w] 即为所求 初始化分两种情况
、如果背包要求正好装满则初始化 f[] = , f[~w] = -INF;
、如果不需要正好装满 f[~v] = ; 多重背包问题要求很简单,就是每件物品给出确定的件数,求
可得到的最大价值 多重背包转换成 背包问题就是多了个初始化,把它的件数C 用
分解成若干个件数的集合,这里面数字可以组合成任意小于等于C
的件数,而且不会重复,之所以叫二进制分解,是因为这样分解可
以用数字的二进制形式来解释
比如:7的二进制 = 它可以分解成 这三个数可以
组合成任意小于等于7 的数,而且每种组合都会得到不同的数
= 可分解成 四个数字
如果13 = 则分解为 前三个数字可以组合成
7以内任意一个数,加上 = 可以组合成任意一个大于6 小于13
的数,虽然有重复但总是能把 以内所有的数都考虑到了,基于这种
思想去把多件物品转换为,多种一件物品,就可用01 背包求解了。 看代码:
int n; //输入有多少种物品
int c; //每种物品有多少件
int v; //每种物品的价值
int s; //每种物品的尺寸
int count = ; //分解后可得到多少种物品
int value[MAX]; //用来保存分解后的物品价值
int size[MAX]; //用来保存分解后物品体积 scanf("%d", &n); //先输入有多少种物品,接下来对每种物品进行分解 while (n--) { //接下来输入n中这个物品
scanf("%d%d%d", &c, &s, &v); //输入每种物品的数目和价值
for (int k=1; k<=c; k<<=1) { //<<右移 相当于乘二
value[count] = k*v;
size[count++] = k*s;
c -= k;
}
if (c > 0) {
value[count] = c*v;
size[count++] = c*s;
}
} 现在用count 代替 n 就和01 背包问题完全一样了

接下是实战:

 #include<iostream>
#include<algorithm>
#include<string.h>
#include<stdio.h>
using namespace std;
int dp[],a1[],b1[];//数组开大点
int main()
{
int cout1,t,n,m,a,b,c,i,j,k;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
cout1=;
for(i=;i<m;i++)
{
scanf("%d%d%d",&a,&b,&c);
for(k=1;k<=c;k<<=1)
{
a1[cout1]=k*a;
b1[cout1++]=k*b;
c-=k;
}
if(c>0)
{
a1[cout1]=c*a;
b1[cout1++]=c*b;
}
}
memset(dp,,sizeof(dp));
for(i=;i<cout1;i++)
for(j=n;j>=a1[i];j--)
dp[j]=max(dp[j],dp[j-a1[i]]+b1[i]);
printf("%d\n",dp[n]);
}
return ;
}

多重背包问题:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(HDU 2191)(二进制优化)的更多相关文章

  1. hdu 2191 多重背包 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

    http://acm.hdu.edu.cn/showproblem.php?pid=2191 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...

  2. HDUOJ----1114(多重背包)悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

    悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  3. HDU 2191悼念512汶川大地震遇难同胞——珍惜如今,感恩生活(多重背包)

    HDU 2191悼念512汶川大地震遇难同胞--珍惜如今.感恩生活(多重背包) http://acm.hdu.edu.cn/showproblem.php?pid=2191 题意: 如果你有资金n元, ...

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

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

  5. HDU2191_悼念512汶川大地震遇难同胞——珍惜如今,感恩生活(背包/多重背包)

    解题报告 题目传送门 题意: 中文不多说; 思路: 基础多重背包,每一个物品有多个能够选.转换成01背包解. #include <iostream> #include <cstrin ...

  6. HDU2191悼念512汶川大地震遇难同胞——珍惜现在,感恩生活[多重背包]

    悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Jav ...

  7. [原]hdu2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 (这个只是题目名字) (多重背包)

    本文出自:http://blog.csdn.net/svitter 原题:http://acm.hdu.edu.cn/showproblem.php?pid=2191 题意:多重背包问题.转换成为01 ...

  8. HDU2191:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活(多重背包)

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

  9. 【多重背包】HDU 2191 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活

    Time Limit : 1000/1000ms (Java/Other)   Memory Limit : 32768/32768K (Java/Other) Total Submission(s) ...

随机推荐

  1. stl 存放对象析构问题

    vector内数据使用结构体的话是深拷贝,vector内的数据会拷贝一份保存,vector内数据不会丢失.如果vector内数据是指针的话是进行浅拷贝,数据超出作用域后会自动析构,vector内所指向 ...

  2. C# 操作pem 文件

    using Dscf.Bpl.InformationAuditBpl; using Dscf.Bpl.ProductBpl; using Dscf.Global.CommonAduit; using ...

  3. Flume NG简介及配置

    Flume下载地址:http://apache.fayea.com/flume/ 常用的分布式日志收集系统: Apache Flume. Facebook Scribe. Apache Chukwa ...

  4. 开源GIS简介.学习

    开发者都希望自己的软件能够运行在尽可能多的计算机上.然而事与愿违,摆在 GIS开发者面前的仍然是对峙的平台.J2EE随着Java5.0的发布,已经正式更名为JavaEE,而微软也正式发布了.NET2. ...

  5. 程序的删除kill、killall

    发送信号给程序,或者列出信号集 SYNOPSIS        kill [-s SIGNAL | -SIGNAL] PID...        kill -l [SIGNAL]...   1.信号操 ...

  6. 详解Oracle DELETE和TRUNCATE 的区别(摘)

    语法delete from aa truncate table aa 区别 1.delete from后面可以写条件,truncate不可以. 2.delete from记录是一条条删的,所删除的每行 ...

  7. Rule of Modularity

    As Brian Kernighan once observed, “Controlling complexity is the essence of computer programming.” . ...

  8. LoadRunner常见问题整理

      1  LoadRunner录制脚本时为什么不弹出IE浏览器? 当一台主机上安装多个浏览器时,LoadRunner录制脚本经常遇到不能打开浏览器的情况,可以用下面的方法来解决. 启动浏览器,打开In ...

  9. struts1 html: textarea 不换行,变形

    <html:textarea property="summary" style="word-wrap:break-word;word-break:break-all ...

  10. 第12章 在.NET中操作XML

    12.1 XML概述 12.1.1 为什么要有XML 12.1.2 XML文档结构 (1)文档声明 <?xml version="1.0"encoding="UTF ...