找回密码
 点一下
查看: 970|回复: 10

让你们见识新世纪少年学C++编的是什么!!(经典编程问题:背包)

[复制链接]
发表于 2009-6-24 17:31:19 | 显示全部楼层 |阅读模式
以下内容摘自网上:

P01: 01背包问题
题目
有N件物品和一个容量为V的背包。第i件物品的费用是c,价值是w。求解将哪些物品装入背包可使这些物品的费用总和不超过背包容量,且价值总和最大。
















基本思路
这是最基础的背包问题,特点是:每种物品仅有一件,可以选择放或不放。

用子问题定义状态:即f[v]表示前i件物品恰放入一个容量为v的背包可以获得的最大价值。则其状态转移方程便是:f[v]=max{f[i-1][v],f[i-1][v-c]+w}。

这个方程非常重要,基本上所有跟背包相关的问题的方程都是由它衍生出来的。所以有必要将它详细解释一下:“将前i件物品放入容量为v的背包中”这个子问题,若只考虑第i件物品的策略(放或不放),那么就可以转化为一个只牵扯前i-1件物品的问题。如果不放第i件物品,那么问题就转化为“前i-1件物品放入容量为v的背包中”;如果放第i件物品,那么问题就转化为“前i-1件物品放入剩下的容量为v-c的背包中”,此时能获得的最大价值就是f [i-1][v-c]再加上通过放入第i件物品获得的价值w

注意f[v]有意义当且仅当存在一个前i件物品的子集,其费用总和为v。所以按照这个方程递推完毕后,最终的答案并不一定是f[N] [V],而是f[N][0..V]的最大值。如果将状态的定义中的“恰”字去掉,在转移方程中就要再加入一项f[v-1],这样就可以保证f[N] [V]就是最后的答案。至于为什么这样就可以,由你自己来体会了。

优化空间复杂度
以上方法的时间和空间复杂度均为O(N*V),其中时间复杂度基本已经不能再优化了,但空间复杂度却可以优化到O(V)。

先考虑上面讲的基本思路如何实现,肯定是有一个主循环i=1..N,每次算出来二维数组f[0..V]的所有值。那么,如果只用一个数组f [0..V],能不能保证第i次循环结束后f[v]中表示的就是我们定义的状态f[v]呢?f[v]是由f[i-1][v]和f[i-1] [v-c]两个子问题递推而来,能否保证在推f[v]时(也即在第i次主循环中推f[v]时)能够得到f[i-1][v]和f[i-1][v -c]的值呢?事实上,这要求在每次主循环中我们以v=V..0的顺序推f[v],这样才能保证推f[v]时f[v-c]保存的是状态f[i -1][v-c]的值。伪代码如下:

for i=1..N
for v=V..0
f[v]=max{f[v],f[v-c]+w};

其中的f[v]=max{f[v],f[v-c]}一句恰就相当于我们的转移方程f[v]=max{f[i-1][v],f[i- 1][v-c]},因为现在的f[v-c]就相当于原来的f[i-1][v-c]。如果将v的循环顺序从上面的逆序改成顺序的话,那么则成了f[v]由f[v-c]推知,与本题意不符,但它却是另一个重要的背包问题P02最简捷的解决方案,故学习只用一维数组解01背包问题是十分必要的。

总结
01背包问题是最基本的背包问题,它包含了背包问题中设计状态、方程的最基本思想,另外,别的类型的背包问题往往也可以转换成01背包问题求解。故一定要仔细体会上面基本思路的得出方法,状态转移方程的意义,以及最后怎样优化的空间复杂度。


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/paradisemoon/archive/2009/05/29/4224763.aspx

代码:
[codes=C++]
#include <iostream>

using namespace std;

int main()
{
    int N = 0, V = 0;
    cin >> N >> V;
    int * DP = new int [V+1];
    int i = 0, j = 0;
    int temp = 0, weight = 0;
    for ( i = 0; i <= V; i++ )
    {
        DP = 0;
    }
    for ( i = 0; i < N; i++ )
    {
        scanf( "%d%d", &temp, &weight );
        for ( j = V; j >= temp; j-- )
        {
            if ( DP[j-temp] + weight > DP[j] )
            {
                DP[j] = DP[j-temp] + weight;
            }
        }
    }
    cout << DP[V];
    system( "PAUSE" );
    return 0;
}
[/codes]
发表于 2009-6-24 17:39:46 | 显示全部楼层
实际上就素比赛专用。
回复

使用道具 举报

发表于 2009-6-24 17:53:02 | 显示全部楼层
C++。。。
很多不懂
回复

使用道具 举报

阿里山慝少 该用户已被删除
发表于 2009-6-24 17:56:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

发表于 2009-6-24 20:16:21 | 显示全部楼层
NOI ~~~~~~ [s:166]
回复

使用道具 举报

发表于 2009-6-24 21:04:15 | 显示全部楼层
路过
回复

使用道具 举报

发表于 2009-6-24 21:47:17 | 显示全部楼层
看不懂
回复

使用道具 举报

发表于 2009-6-25 11:07:52 | 显示全部楼层
这不就是背包问题嘛、、
在OI里是基础恩- -
回复

使用道具 举报

发表于 2009-6-25 11:45:45 | 显示全部楼层
scanf。。。怎么看都不像C++,C和C++还是有区别的。
贴个原汁原味的C++代码(摘自本人的的GMM)
  1. template <
  2. &#160;&#160;&#160;&#160;template <
  3. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;typename _ContainerType,
  4. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;typename _ContainerAllocator
  5. &#160;&#160;&#160;&#160;> class _Container,
  6. &#160;&#160;&#160;&#160;typename _Allocator,
  7. &#160;&#160;&#160;&#160;typename _StringChar,
  8. &#160;&#160;&#160;&#160;typename _StringCharTraits,
  9. &#160;&#160;&#160;&#160;typename _StringAllocator
  10. >
  11. inline void string_advanced_split(
  12. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;const std::basic_string<
  13. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_StringChar,
  14. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_StringCharTraits,
  15. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_StringAllocator> &compoundString,
  16. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_Container<
  17. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;std::basic_string<
  18. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_StringChar,
  19. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_StringCharTraits,
  20. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_StringAllocator
  21. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;>,
  22. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_Allocator> &stringContainer,
  23. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_StringChar quote,
  24. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;_StringChar delim
  25. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;)
  26. {
  27. &#160;&#160;&#160;&#160;typedef std::basic_string<_StringChar, _StringCharTraits, _StringAllocator> StringType;
  28. &#160;&#160;&#160;&#160;bool inQuotes = false;
  29. &#160;&#160;&#160;&#160;StringType chunkString;
  30. &#160;&#160;&#160;&#160;BOOST_FOREACH(_StringChar ch, compoundString)
  31. &#160;&#160;&#160;&#160;{
  32. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (inQuotes)
  33. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
  34. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (ch == quote)
  35. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
  36. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;inQuotes = false;
  37. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
  38. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else
  39. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
  40. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;chunkString += ch;
  41. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
  42. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
  43. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else
  44. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
  45. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;if (ch == delim)
  46. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
  47. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;stringContainer.push_back(chunkString);
  48. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;chunkString.clear();
  49. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
  50. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else if (ch == quote)
  51. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
  52. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;inQuotes = true;
  53. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
  54. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;else
  55. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;{
  56. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;chunkString += ch;
  57. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
  58. &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;}
  59. &#160;&#160;&#160;&#160;}
  60. &#160;&#160;&#160;&#160;stringContainer.push_back(chunkString);
  61. }
复制代码
回复

使用道具 举报

发表于 2009-6-25 12:34:29 | 显示全部楼层
应该说c++可以兼容C吧
C、C++区别的确挺大的  
变量的申明
面向对象(最大区别吧)
当然包括泛型
等~
纯属个人观点- -
回复

使用道具 举报

发表于 2009-6-25 13:31:59 | 显示全部楼层
-。   -看到template< template<了,悲剧的VC6不支持ORZ。。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 点一下

本版积分规则

Archiver|移动端|小黑屋|地精研究院

GMT+8, 2024-11-22 01:51 , Processed in 0.033123 second(s), 19 queries .

Powered by Discuz! X3.5

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表