题意:完全背包

思路:完全背包

可以直接转化为 多重背包,num[i]=_v/c[i];//转为多重背包
然后运用 多重背包 3种解法如下
码1:

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5. int dp[];
  6. int main()
  7. {
  8. int i,j,k,tem;
  9. int t,n,_v;//测试用例个数,物品种类,背包大小
  10. int c[],v[];//花费,价值
  11. int num[];//每种物品个数
  12. int tc,tv;//拆分时物品花费,价值
  13. while(~scanf("%d",&n))
  14. {
  15. memset(dp,,sizeof(dp));
  16.  
  17. for(i=; i<=n; ++i)scanf("%d%d",&v[i],&c[i]);
  18. scanf("%d",&_v);
  19. for(i=; i<=n; ++i)num[i]=_v/c[i];//转为多重背包
  20. //////
  21. for(i=; i<=n; ++i)
  22. for(k=_v; k>=c[i]; --k)
  23. for(j=; j<=num[i]&&j*c[i]<=k; ++j)//此处比01背包多了一层循环
  24. {
  25. tc=j*c[i];
  26. tv=j*v[i];
  27. tem=dp[k-tc]+tv;
  28. if(tem>dp[k])dp[k]=tem;
  29. }
  30. //
  31. printf("%d\n",dp[_v]);
  32. }
  33. return ;
  34. }

码2:

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5. int dp[];
  6. int main()
  7. {
  8. int i,j,k,tem;
  9. int t,n,_v;//测试用例个数,物品种类,背包大小
  10. int c[],v[];//花费,价值
  11. int num[];//每种物品个数
  12. int tc,tv;//拆分时物品花费,价值
  13. while(~scanf("%d",&n))
  14. {
  15. memset(dp,,sizeof(dp));
  16.  
  17. for(i=; i<=n; ++i)scanf("%d%d",&v[i],&c[i]);
  18. scanf("%d",&_v);
  19. for(i=; i<=n; ++i)num[i]=_v/c[i];//转为多重背包
  20. //////
  21. for(i=; i<=n; ++i)
  22. for(j=; j<=num[i]&&j*c[i]<=_v; ++j)//此处比01背包多了一层循环
  23. for(k=_v; k>=j*c[i]; --k)
  24. {
  25. tem=dp[k-c[i]]+v[i];
  26. if(tem>dp[k])dp[k]=tem;
  27. }
  28. //
  29. printf("%d\n",dp[_v]);
  30. }
  31. return ;
  32. }

码3:

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5. int dp[];
  6. int main()
  7. {
  8. int i,j,k,tem;
  9. int t,n,_v;//测试用例个数,物品种类,背包大小
  10. int c[],v[];//花费,价值
  11. int num[];//每种物品个数
  12. int tc,tv;//拆分时物品花费,价值
  13. while(~scanf("%d",&n))
  14. {
  15. memset(dp,,sizeof(dp));
  16.  
  17. for(i=; i<=n; ++i)scanf("%d%d",&v[i],&c[i]);
  18. scanf("%d",&_v);
  19. for(i=; i<=n; ++i)num[i]=_v/c[i];//转为多重背包
  20. //////
  21. for(i=; i<=n; ++i)
  22. {
  23. for(j=; j<=num[i]; num[i]=num[i]-j,j=j*)//此处比01背包多了一层循环
  24. {
  25. tc=j*c[i];//拆分后物品花费
  26. tv=j*v[i];//
  27. for(k=_v; k>=tc; --k)
  28. {
  29. tem=dp[k-tc]+tv;
  30. if(tem>dp[k])dp[k]=tem;
  31. }
  32. }
  33. if(num[i]>) //如果还有物品,num[i] 即相当于 1+2+4+...+q 中的 q
  34. {
  35. tc=num[i]*c[i];
  36. tv=num[i]*v[i];
  37. for(k=_v; k>=tc; --k)
  38. {
  39. tem=dp[k-tc]+tv;
  40. if(tem>dp[k])dp[k]=tem;
  41. }
  42. }
  43. }
  44. //
  45. printf("%d\n",dp[_v]);
  46. }
  47. return ;
  48. }

另外:附一种更高效的方法 O(n*_v)
与01背包代码中内层循环相反
1...n
   0..._v

码4:

  1. #include<iostream>
  2. #include<stdio.h>
  3. #include<string.h>
  4. using namespace std;
  5. int dp[];
  6. int main()
  7. {
  8. int i,j;
  9. int t,n,_v;//测试用例个数,物品种类,背包大小
  10. int c[],v[];//花费,价值
  11. while(~scanf("%d",&n))
  12. {
  13. memset(dp,,sizeof(dp));
  14. for(i=; i<=n; ++i)scanf("%d%d",&v[i],&c[i]);
  15. scanf("%d",&_v);
  16. for(i=; i<=n; ++i)
  17. for(j=c[i];j<=_v;++j)
  18. if(dp[j-c[i]]+v[i]>dp[j])dp[j]=dp[j-c[i]]+v[i];
  19. printf("%d\n",dp[_v]);
  20. }
  21. return ;
  22. }

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. 一行代码设置TForm颜色的前世今生(属性赋值引起函数调用,然后发消息实现改变显示效果),TForm的初始颜色在dfm中设置了clBtnFace色

    来自万一的帖子:http://www.cnblogs.com/del/archive/2008/04/27/1173658.html的确做到了一行代码设置TForm控件的颜色(一点感想:Delphi程 ...

  2. WordPress主题制作教程8:自定义page模版

    创建新文件,头部注释 <?php /* Template Name: 新的page模版 */ ?> 在页面编辑右栏体现:

  3. MyBaits的各种基本查询方式

    <?xml version="1.0" encoding="gbk"?> <!DOCTYPE mapper PUBLIC "-//m ...

  4. hihoCoder 1082然而沼跃鱼早就看穿了一切 (字符串处理)

    http://hihocoder.com/problemset/problem/1082 首先将字符串全部字母变成小写,不断用find查找字符串中的Marshtomp,并把每个字符变为’#‘ ,最后统 ...

  5. asp天猫自主发码的请求

    这几天在做天猫自主发码.实现了通知和核销部门.其他的部分待后续实现. 值得注意的是consume回调中,要加入sign_method=md5

  6. Android HTTPS(5)SSL测试工具

    Nogotofail: A Network Traffic Security Testing Tool Nogotofail is a tool gives you an easy way to co ...

  7. [HDOJ1171]Big Event in HDU(01背包)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1171 许多有价值的物品,有重复.问如何将他们分成两堆,使两堆价值之差最小. 对价值求和,转换成01背包 ...

  8. 利用XPath读取Xml文件

    之所以要引入XPath的概念,目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素.可以把XPath比作文件管理路径:通过文件管理路 径,可以按照一定的规则查找到所需要的文件:同样,依据X ...

  9. oracle教程:PLSQL常用方法汇总

    oracle教程:PLSQL常用方法汇总 在SQLPLUS下,实现中-英字符集转换alter session set nls_language='AMERICAN';alter session set ...

  10. Gradle学习系列(一)

    今天就开始学习Gradle构建了,听说很牛X.本篇内容就带领我初步窥探Gradle的世界.     1.什么是Gradle       相信之前都接触过用Ant或者Meavn进行项目的构建,两者各有千 ...