• 4、0-1背包问题


        背包问题

                对于0-1背包问题,由于我们对一个商品只有两种选择:要或者不要。于是我们的背包问题不是一个贪心算法问题,很简单 
    如果选用贪心算法,我们肯定是决定选用“商品单位重量价值最高“,如下面的例子则相反了

    如上图中有3种商品的价值以及重量,背包容量为50.
    那么如果选用贪心算法,则商品1的单位重量价值最高为60/10=6.
    而商品2和商品3的分别为100/20和120/30为5和4.肯定不行,但是如果选用商品1,则2和3只能选一个

    但是如果选用商品2和3,则:

    于是,我们可以看到,选2和3的总价值高于选用1和其它的组合。
    这是因为你选商品1和其它的组合后总是会浪费背包的一些空间,而商品2和3的组合却能够充分利用背包的容量。
    结论:0-1背包问题是一个动态规划问题,而不是贪心算法问题。
    主体函数代码如下:
    1. void packageProb(int packageCap,int valueSum,int *productWeight,int *productValue,int *flag,int Len){
    2. int i;
    3. std::cout<<valueSum<<std::endl;
    4. for(i=0;i<Len; i++){
    5. int flag_f[3]={0};
    6. int packageC=packageCap;
    7. int valueS=valueSum;
    8. for(int j=0;j<3; j++){
    9. flag_f[j]=flag[j];
    10. }
    11. if(packageC>=productWeight[i]&&!flag[i]){
    12. int packageCC=packageCap-productWeight[i];
    13. int valueSS=valueS+productValue[i];
    14. flag_f[i]=1;
    15. for(int i=0;i<Len; i++){
    16. if(flag_f[i])
    17. std::cout<<i<<std::endl;
    18. }
    19. std::cout<<valueSS<<std::endl;
    20. std::cout<<std::endl;
    21. packageProb(packageCC,valueSS,productWeight,productValue,flag_f,Len);
    22. }
    23. }
    24. }
     测试代码如下:
    1. int productWeight[3]={10,20,30};
    2. int productValue[3]={60,100,120};
    3. int flag[3]={0};
    4. packageProb(50,0,productWeight,productValue,flag,3);
    如上面代码所以,对于递归问题,我们一定要知道每次向下递归的时候,程序的栈只会保存一些函数的局部变量和返回地址空间等信息,
    不会保存调用参数中的值,调用参数是会在每次递归中是会跟着变的。




  • 相关阅读:
    3个检测浏览器UserAgent信息的网站
    linux系统下配置网桥(CentOS 5.5)
    squid封禁不带UserAgent的请求
    iptables透明网桥无法使用透明代理错误
    Squid修改用户浏览器的Useragent信息
    MySQL主从复制(MasterSlave)与读写分离(MySQLProxy)实践
    js中格式化时间
    js获取当前月的第一天和最后一天
    JS String.toDate
    Js获取当前日期时间及其它操作
  • 原文地址:https://www.cnblogs.com/yml435/p/4655575.html
Copyright © 2020-2023  润新知