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) ...
随机推荐
- 一个字典通过dictionaryWithDictionary 他们的内存指针是不同的
一个字典通过dictionaryWithDictionary 他们的内存指针是不同的 来自为知笔记(Wiz)
- python实现全角半角的相互转换
缘起 在自然语言处理过程中,全角.半角的的不一致会导致信息抽取不一致,因此需要统一. 转换说明 全角半角转换说明 有规律(不含空格): 全角字符unicode编码从65281~65374 (十六进制 ...
- struts2不兼容servlet、COS
如果你在一个项目中使用了struts2,也就是说,你在web.xml中配置了如下代码: <filter> <filter-name>struts2</filter-nam ...
- c++ 在客户端的GCC使用
c++ 在客户端的GCC使用 翻译自: GCC是GNU工具箱的一个功能,GNU还包括如下功能: GNU compiler collection (GCC) GNU make GNU Debugger ...
- SUN dataset图像数据集下载
SUN dataset数据集,有两个不错的网址: http://vision.princeton.edu/projects/2010/SUN/ (普林斯顿大学) http://groups.csail ...
- 数据仓库的自动ETL研究
但是,在实施数据集成的过程中,由于不同用户提供的数据可能来自不同的途径,其数据内容.数据格式和数据质量千差万别,有时甚至会遇到数据格式不能转换或数据转换格式后丢失信息等棘手问题,严重阻碍了数据在各部门 ...
- 单元测试之道(使用NUnit)
首先来看下面几个场景你是否熟悉 1.你正在开发一个系统,你不断地编码-编译-调试-编码-编译-调试……终于,你负责的功能模块从上到下全部完成且编译通过!你长出一口气,怀着激动而 又忐忑的心情点击界面上 ...
- win7下搭建opengles2.0编程环境
原帖地址:http://sixgod.org/archives/72 1.下载AMD的OpenGL ES2.0的模拟器,地址: http://www.opengles-book.com/ESEmu ...
- document.body.innerHTML用jquery如何表示
$("body").html('XXXX'); //这个是赋值 $("body").html(); //这个是获取HTML的内容
- eclipse有生成不带参数的构造方法的快捷键吗
你打上类名的2个字母,然后”alt“ +“/” 基本上选第一个就行了