HDU 2191多重背包问题、
#include<cstdio>
#include<cmath>
#include<iostream>
#include<cstring>
const int qq=+;
int v[qq],w[qq],dp[qq];
using namespace std;
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n,m;
scanf("%d %d",&n,&m);
memset(dp,,sizeof(dp));
memset(v,,sizeof(v));
memset(w,,sizeof(w));
int count=;
for(int i=;i<m;++i){
int value,weight,tot;
scanf("%d %d %d",&value,&weight,&tot);
int t=;
while(tot>=t){
v[count]=t*value;
w[count++]=t*weight;
tot-=t;
t<<=;
}
if(tot){
v[count]=tot*value;
w[count++]=tot*weight;
}
}
for(int i=;i<count;++i)
for(int j=n;j>=v[i];--j) //j必须从n开始dp,如果循序开始dp的话v[i]会被取多次
dp[j]=max(dp[j],dp[j-v[i]]+w[i]); //也就是说达不到01背包要求的v[i]只有取和不取两种状态、
printf("%d\n",dp[n]);
}
}
算法时间复杂度O(V*∑log n[i])
总算是理解了为什么要逆序dp
#include <stdio.h>
.#include <string.h>
.#include <algorithm>
.using namespace std;
.int main()
.{
. int ncase,p[],w[],c[],dp[];
. scanf("%d",&ncase);
. while(ncase--)
. {
. int n,m,count=;
. scanf("%d %d",&n,&m);
. for(int i=;i<m;i++)
. scanf("%d %d %d",&p[i],&w[i],&c[i]);
. memset(dp,,sizeof(dp));
. int temp=;
. for(int i=;i<m;i++)
. {
. for(int j=n;j>=p[i];j--)//唉在这里又错了几次 要倒着来。
. {
. for(int k=;k<=c[i];k++)
. {
. if(j<k*p[i]) break;
. dp[j]=max(dp[j-k*p[i]]+k*w[i],dp[j]);
. if(dp[j]>temp)
. temp=dp[j];
. }
. }
. }
. printf("%d\n",temp);
. }
. return ;
.}
上述代码是借鉴别人的、 也是多重背包最原始的解法
时间复杂度O(V*∑n[i])
HDU 2191多重背包问题、的更多相关文章
- HDU 1114 完全背包 HDU 2191 多重背包
HDU 1114 Piggy-Bank 完全背包问题. 想想我们01背包是逆序遍历是为了保证什么? 保证每件物品只有两种状态,取或者不取.那么正序遍历呢? 这不就正好满足完全背包的条件了吗 means ...
- hdu 2191 (多重背包+二进制优化)
Problem Description 急!灾区的食物依然短缺!为了挽救灾区同胞的生命,心系灾区同胞的你准备自己采购一些粮食支援灾区,现在假设你一共有资金n元,而市场有m种大米,每种大米都是袋装产品, ...
- hdu 2191 多重背包
悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & ...
- hdu 2191多重背包
悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Jav ...
- 【HDU】2191 多重背包问题
原题目:悼念512汶川大地震遇难同胞——珍惜现在,感恩生活 [算法]多重背包(有限背包) 动态规划 [题解]http://blog.csdn.net/acdreamers/article/detail ...
- hdu 2191 多重背包 悼念512汶川大地震遇难同胞——珍惜现在,感恩生活
http://acm.hdu.edu.cn/showproblem.php?pid=2191 New~ 欢迎“热爱编程”的高考少年——报考杭州电子科技大学计算机学院关于2015年杭电ACM暑期集训队的 ...
- hdu 2191 (多重背包二进制优化)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191 实现代码: #include<bits/stdc++.h> using namespac ...
- HDU 1059 多重背包问题
问题大意: 有价值1-6的六种物品,分别规定其数目,问是否存在一种方法能使这些物品不拆分就能平均分给两个人 #include <cstdio> #include <cstring&g ...
- hdu 2191 【背包问题】
题目 请输出能够购买大米的最多重量,注意是重量不是价值. 把每一种物品拧出来,用01背包解决. #include <cstdio> #include <iostream> #i ...
随机推荐
- webpack学习之—— Plugins
Plugins are the backbone of webpack! webpack 自身也是构建于你在 webpack 配置中用到的相同的插件系统之上! 插件目的在于解决 loader 无法实现 ...
- AOP Aspect 统一日志、异常处理、数据格式 【转】
package com.gsww.chis.aop; import java.util.Arrays; import com.google.common.base.Throwables; import ...
- JavaScript 生成32位UUID
function uuid(){ var len=32; //32长度 var radix=16; //16进制 var chars='0123456789ABCDEFGHIJKLMNOPQRSTUV ...
- 【风马一族_php】数组函数
原文来自:http://www.cnblogs.com/sows/p/6045699.html (博客园的)风马一族 侵犯版本,后果自负 2016-11-09 15:56:26 数组 函数 php- ...
- qt获取本机用户名
//获取用户名 QString getUserName() { #if 1 QStringList envVariables; envVariables << "USERNAME ...
- LintCode_111 爬楼梯
题目 假设你正在爬楼梯,需要n步你才能到达顶部.但每次你只能爬一步或者两步,你能有多少种不同的方法爬到楼顶部? 比如n=3,中不同的方法 返回 3 1 2 3 5 8 13... step[2] = ...
- thrift python安装
http://thrift.apache.org/download/ tar -zxvf thrift-0.11.0.tar.gz cd thrift-0.11.0 ./configure --pre ...
- Linux使用注意事项
1.Linux严格区分大小写 2.Linux中所有内容以文件形式保存,包括硬件 3.修改任何设置,若想永久生效,都需要修改配置文件(除非某些发现版已经默认设置为同时修改内存和硬盘数据). 4.Linu ...
- thinkphp php审核后返回信息给html
1.die("<script>alert('至少选择一个收款方式!');history.back(-1);</script>");
- oracle中常用的时间格式转换
1:取得当前日期是本月的第几周 select to_char(sysdate,'YYYYMMDD W HH24:MI:SS') from dual; TO_CHAR(SYSDATE,'YY') se ...