题意:完全背包

思路:完全背包

可以直接转化为 多重背包,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(完全背包)的更多相关文章

  1. HDU 4508 湫湫系列故事——减肥记I(全然背包)

    HDU 4508 湫湫系列故事--减肥记I(全然背包) http://acm.hdu.edu.cn/showproblem.php?pid=4508 题意: 有n种食物, 每种食物吃了能获得val[i ...

  2. 完全背包问题:湫湫系列故事――减肥记I(HDU 4508)

    湫湫系列故事――减肥记I  HDU 4508 一道裸的完全背包 #include<iostream> #include<algorithm> #include<stdio ...

  3. HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包)

    HDOJ(HDU).4508 湫湫系列故事――减肥记I (DP 完全背包) 题意分析 裸完全背包 代码总览 #include <iostream> #include <cstdio& ...

  4. HDUOJ----湫湫系列故事——减肥记I

    湫湫系列故事——减肥记I Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tota ...

  5. hdu4508 完全背包,湫湫系列故事——减肥记I

    湫湫系列故事——减肥记I 对于01背包和完全背包,昨晚快睡着的时候,突然就来了灵感 区别:dp[i][v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值 在第二重循环,01 是倒着循环的,因 ...

  6. HDUOJ----4509湫湫系列故事——减肥记II

    湫湫系列故事——减肥记II Time Limit: 5000/2000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Tot ...

  7. G - 湫湫系列故事——减肥记I

    G - 湫湫系列故事——减肥记I Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u De ...

  8. M - 湫湫系列故事——减肥记I

    M - 湫湫系列故事--减肥记I 对于吃货来说,过年最幸福的事就是吃了,没有之一! 但是对于女生来说,卡路里(热量)是天敌啊! 资深美女湫湫深谙"胖来如山倒,胖去如抽丝"的道理,所 ...

  9. HDU 4508 湫湫系列故事——减肥记I (2013腾讯编程马拉松初赛第一场)

    http://acm.hdu.edu.cn/showproblem.php?pid=4508 题目大意: 给定一些数据. 每组数据以一个整数n开始,表示每天的食物清单有n种食物.  接下来n行,每行两 ...

  10. 【完全背包】HDU 4508 湫湫系列故事——减肥记I

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

随机推荐

  1. android-exploitme(六):基础加密

    这次我们看看程序在设备上存储了什么敏感信息 (server-env)sartre:AndroidLabs2 maxim$ adb shell # cd /data/data/com.securityc ...

  2. 273. Integer to English Words

    题目: Convert a non-negative integer to its english words representation. Given input is guaranteed to ...

  3. iOS:分割控制器UISplitViewcontroller

    分割控制器UISplitViewController <1>功能:它也是ipad的一个新特性,在屏幕上可以同时显示两个控制器,左边一个,右边一个:左边的为主控制器,右边的为详细控制器,主控 ...

  4. WebService另一种轻量级实现—Hessian 学习笔记

    最近和同事聊天,得知他们在使用一种叫做Hessian的WebService实现方式实现远 程方法调用,是轻量级的,不依赖JavaEE容器,同时也是二进制数据格式传输,效率比SOAP的XML方式要高.感 ...

  5. tomcat manager app 和 host maganger

    当你以为你了解某个东西时,其实你不了解它.比如tomcat也可以像jboss一样有用户名和密码 就在apache-tomcat-8.0.21\conf\tomcat-users.xml里配置用户名和密 ...

  6. C# 打印小票 POS

    C# 打印小票 POS 最近在写一个餐饮的收银系统,以前从来没有碰过打印机这玩意.感觉有些无从下手,在前面做报表时,总想找第三方的控件来用用,结果始终不行没搞定.没研究透,催得急没办法还是的动手自己写 ...

  7. Hadoop集群(第2期)_机器信息分布表

    1.分布式环境搭建 采用4台安装Linux环境的机器来构建一个小规模的分布式集群. 图1 集群的架构 其中有一台机器是Master节点,即名称节点,另外三台是Slaver节点,即数据节点.这四台机器彼 ...

  8. 函数ut_malloc_low

    /**********************************************************************//** Allocates memory. @retur ...

  9. 使用git submodule管理一个需要多个分立开发或者第三方repo的项目

    在项目开发中,特别是web前端开发中,有非常多的开源第三方library,我们希望引用他们,同时也希望能够方便地保持这些第三方 开源repo的更新.另外一方面如果我们自己在开发一个网站的项目,这个项目 ...

  10. ASP.NET MVC+EasyUI+Entity FrameWork 整合开发

    本文详细讲解怎么用ASP.NET MVC+EasyUI+Entity FrameWork 来开发一个项目 对于ASP.NET MVC的Jscript库,主要引用 <script type=.mi ...