hdu 4508 湫湫系列故事——减肥记I(完全背包)
题意:完全背包
思路:完全背包
可以直接转化为 多重背包,num[i]=_v/c[i];//转为多重背包
然后运用 多重背包 3种解法如下
码1:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[];
int main()
{
int i,j,k,tem;
int t,n,_v;//测试用例个数,物品种类,背包大小
int c[],v[];//花费,价值
int num[];//每种物品个数
int tc,tv;//拆分时物品花费,价值
while(~scanf("%d",&n))
{
memset(dp,,sizeof(dp)); for(i=; i<=n; ++i)scanf("%d%d",&v[i],&c[i]);
scanf("%d",&_v);
for(i=; i<=n; ++i)num[i]=_v/c[i];//转为多重背包
//////
for(i=; i<=n; ++i)
for(k=_v; k>=c[i]; --k)
for(j=; j<=num[i]&&j*c[i]<=k; ++j)//此处比01背包多了一层循环
{
tc=j*c[i];
tv=j*v[i];
tem=dp[k-tc]+tv;
if(tem>dp[k])dp[k]=tem;
}
//
printf("%d\n",dp[_v]);
}
return ;
}
码2:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[];
int main()
{
int i,j,k,tem;
int t,n,_v;//测试用例个数,物品种类,背包大小
int c[],v[];//花费,价值
int num[];//每种物品个数
int tc,tv;//拆分时物品花费,价值
while(~scanf("%d",&n))
{
memset(dp,,sizeof(dp)); for(i=; i<=n; ++i)scanf("%d%d",&v[i],&c[i]);
scanf("%d",&_v);
for(i=; i<=n; ++i)num[i]=_v/c[i];//转为多重背包
//////
for(i=; i<=n; ++i)
for(j=; j<=num[i]&&j*c[i]<=_v; ++j)//此处比01背包多了一层循环
for(k=_v; k>=j*c[i]; --k)
{
tem=dp[k-c[i]]+v[i];
if(tem>dp[k])dp[k]=tem;
}
//
printf("%d\n",dp[_v]);
}
return ;
}
码3:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[];
int main()
{
int i,j,k,tem;
int t,n,_v;//测试用例个数,物品种类,背包大小
int c[],v[];//花费,价值
int num[];//每种物品个数
int tc,tv;//拆分时物品花费,价值
while(~scanf("%d",&n))
{
memset(dp,,sizeof(dp)); for(i=; i<=n; ++i)scanf("%d%d",&v[i],&c[i]);
scanf("%d",&_v);
for(i=; i<=n; ++i)num[i]=_v/c[i];//转为多重背包
//////
for(i=; i<=n; ++i)
{
for(j=; j<=num[i]; num[i]=num[i]-j,j=j*)//此处比01背包多了一层循环
{
tc=j*c[i];//拆分后物品花费
tv=j*v[i];//
for(k=_v; k>=tc; --k)
{
tem=dp[k-tc]+tv;
if(tem>dp[k])dp[k]=tem;
}
}
if(num[i]>) //如果还有物品,num[i] 即相当于 1+2+4+...+q 中的 q
{
tc=num[i]*c[i];
tv=num[i]*v[i];
for(k=_v; k>=tc; --k)
{
tem=dp[k-tc]+tv;
if(tem>dp[k])dp[k]=tem;
}
}
}
//
printf("%d\n",dp[_v]);
}
return ;
}
另外:附一种更高效的方法 O(n*_v)
与01背包代码中内层循环相反
1...n
0..._v
码4:
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
int dp[];
int main()
{
int i,j;
int t,n,_v;//测试用例个数,物品种类,背包大小
int c[],v[];//花费,价值
while(~scanf("%d",&n))
{
memset(dp,,sizeof(dp));
for(i=; i<=n; ++i)scanf("%d%d",&v[i],&c[i]);
scanf("%d",&_v);
for(i=; i<=n; ++i)
for(j=c[i];j<=_v;++j)
if(dp[j-c[i]]+v[i]>dp[j])dp[j]=dp[j-c[i]]+v[i];
printf("%d\n",dp[_v]);
}
return ;
}
hdu 4508 湫湫系列故事——减肥记I(完全背包)的更多相关文章
- HDU 4508 湫湫系列故事——减肥记I(全然背包)
HDU 4508 湫湫系列故事--减肥记I(全然背包) http://acm.hdu.edu.cn/showproblem.php?pid=4508 题意: 有n种食物, 每种食物吃了能获得val[i ...
- 完全背包问题:湫湫系列故事――减肥记I(HDU 4508)
湫湫系列故事――减肥记I HDU 4508 一道裸的完全背包 #include<iostream> #include<algorithm> #include<stdio ...
- HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包)
HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包) 题意分析 裸完全背包 代码总览 #include <iostream> #include <cstdio& ...
- HDUOJ----湫湫系列故事——减肥记I
湫湫系列故事——减肥记I Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tota ...
- hdu4508 完全背包,湫湫系列故事——减肥记I
湫湫系列故事——减肥记I 对于01背包和完全背包,昨晚快睡着的时候,突然就来了灵感 区别:dp[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值 在第二重循环,01 是倒着循环的,因 ...
- HDUOJ----4509湫湫系列故事——减肥记II
湫湫系列故事——减肥记II Time Limit: 5000/2000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Tot ...
- G - 湫湫系列故事——减肥记I
G - 湫湫系列故事——减肥记I Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u De ...
- M - 湫湫系列故事——减肥记I
M - 湫湫系列故事--减肥记I 对于吃货来说,过年最幸福的事就是吃了,没有之一! 但是对于女生来说,卡路里(热量)是天敌啊! 资深美女湫湫深谙"胖来如山倒,胖去如抽丝"的道理,所 ...
- HDU 4508 湫湫系列故事——减肥记I (2013腾讯编程马拉松初赛第一场)
http://acm.hdu.edu.cn/showproblem.php?pid=4508 题目大意: 给定一些数据. 每组数据以一个整数n开始,表示每天的食物清单有n种食物. 接下来n行,每行两 ...
- 【完全背包】HDU 4508 湫湫系列故事——减肥记I
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other) Total Submission(s) ...
随机推荐
- Hibernate的配置文件解析
配置mybatis.xml或hibernate.cfg.xml报错: <property name="connection.url">jdbc:mysql://loca ...
- linux下jdk安装 failed /usr/local/jdk1.6.0_10/jre/lib/i386/client/libjvm.so
今天在fedora core 4下面安装jdk1.6后,运行java -version,没有出现相关的版本信息,而是出现了以下错误: dl failure on line 685Error: fail ...
- sql语句的基本操作
建立一个数据库 create DATABASE mydatabase; 建立一张数据表: ##创建一个员工表##create table employee( eid int not NULL PRIM ...
- excel 数据导入数据表
环境: Windows server 2012 rm sql server 2012 excel 数据导入数据表 INSERT INTO [dbo].[AdminUser] SELECT [Adm ...
- SQL创建链接服务器
二.--创建链接服务器 exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','远程服务器名或ip地址' exec sp_addlinkedsrvlogin ...
- poj 1180 斜率优化dp
这个题目要是顺着dp的话很难做,但是倒着推就很容易退出比较简单的关系式了. dp[i]=min(dp[u]+(sum[u-1]-sum[i-1]+s)*f[i]);dp[i]代表从i到结尾需要花费的代 ...
- Linux-0.00运行环境搭建【转】
转自:http://blog.csdn.net/rosetta/article/details/8933240 这里的Linux-0.00由Linus Torvalds写的Linux最初版本,只是打印 ...
- hdu - 1180 诡异的楼梯 (bfs+优先队列)
http://acm.hdu.edu.cn/showproblem.php?pid=1180 注意点就是楼梯是在harry移动完之后才会改变方向,那么只要统计到达这个点时间奇偶性,就可以知道当前楼梯是 ...
- Android Touch(3)View的touchDelegate
作用: 基类View有个函数 public void setTouchDelegate(TouchDelegate delegate),给view内部的另一个view设置一个touch代理. 图中vi ...
- Oracle数据库之二
SELECT查询 函数分为: 单行函数 -- 一条记录进入,一条记录输出 多行函数(分组函数)-- 多条记录进入,按组输出 单行函数: select id,first_name,nvl(commiss ...