zoukankan      html  css  js  c++  java
  • 01背包和完全背包

    题目大意:有n 个物品,它们有各自的重量和价值,现有给定容量的背包,如何让背包里装入的物品具有最大的价值总和?

    每个物品的设置为w[i],它的价值设置为c[i]。背包总容量为V。设F[ ] 是每个重量的最大价值。

    状态转移方程为 F[i] = max( F[i-1], F[i-w[i]]+c[i] )。

    每个物品只能取一次,所以要倒推。最后的结果是F[V]。

    核心代码:

    for(int i = 1; i <= n; i++){
    	for(int j = V; w[i] <= j; j--)
    		{
    			f[j] = max(f[j],f[j-w[i]]+c[i]);
    			cout<<j<<" "<<f[j]<<" ";
    		}
    		cout<<endl;
    	}
    

     完全背包的区别是,每个物品可以取无限次。所以直接正推就行了。最后的结果也是F[V]。

    核心代码:

    for(int i = 1; i <= n; i++){
    	for(int j = w[i]; j <= V; j++)
    		{
    			f[j] = max(f[j],f[j-w[i]]+c[i]);
    			cout<<f[j]<<" "; 
    		}
    		cout<<endl;
    	}
    
  • 相关阅读:
    关于MySQL数据库中null的那些事
    Java集合之Collections 剖析
    字符串类
    C++标准库
    << 操作符
    操作符的重载
    类中的重载
    友元
    二阶构造模式
    静态成员函数
  • 原文地址:https://www.cnblogs.com/stul/p/10314379.html
Copyright © 2011-2022 走看看