zoukankan      html  css  js  c++  java
  • 动态规划1.2 购物车选物品

    问题:

    购物车中有n件商品,现有满减条件为满200减50,从购车中选出一些商品,让选出来的商品最大程度的接近满减条件。

    分析:

    选一些商品,让商品的价格大于200,并且尽量的接近200。

    这是一个多阶段决策问题,每个阶段会对应一个状态集合,阶段n的状态可以由阶段 n-1、n-2、...、1 转移而来。

    因为所选物品的总价格没有规定一个上限,我们规定为1001,因为物品总价格超过1000,满减的意义就不大了。

    这样我们申请的二维状态数组每一列就为1001 + 1。

     代码:

     1 #include <iostream>
     2 #include <stack>
     3 
     4 int main()
     5 {
     6     int full = 200;      // 满减条件 
     7     int threshold = 1001;  // 总价超过1001就不考虑了
     8     int items[10] = {22, 33, 44, 23, 25, 90, 80, 2, 43, 16};   //购物车共有10个商品,数组中为每个商品的价值
     9     
    10     int states[10][threshold + 1] = {0};
    11     
    12     if(items[0] < threshold + 1)
    13         states[0][items[0]] = 1;
    14     
    15     for(int i = 1; i < sizeof(items) / sizeof(int); i++)
    16     {
    17         for(int j = 0; j < threshold + 1; j++)  // 不放入第i个物品
    18         {
    19             states[i][j] = states[i-1][j];
    20         }
    21         
    22         for(int j = 0; j < threshold + 1; j++)  // 放入第i个物品
    23         {
    24             if(j + items[i] < threshold + 1)
    25             {
    26                 if(states[i-1][j] == 1)
    27                     states[i][j + items[i]] = 1;
    28             }
    29         }
    30     }
    31     
    32     int value = 10000;
    33     for(int j = 200; j <= threshold; j++)
    34     {
    35         if(states[9][j] == 1)
    36         {
    37             value = j;
    38             break;
    39         }
    40     }
    41 
    42     std::stack<int> s;
    43     
    44     int right = value;
    45     for(int i = 9; i >= 0; i--)
    46     {
    47         for(int j = right; j >= 0; j--)
    48         {
    49             if(states[i][j] == 1)
    50             {
    51                 if(i - 1 >= 0)
    52                 {
    53                     if(j - items[i] >= 0 && states[i - 1][j-items[i]] == 1)
    54                     {
    55                         //std::cout << "i:" << i << ", j" << j << "  item :" << items[i] << std::endl;
    56                         s.push(items[i]);
    57                         right = j - items[i];
    58                         break;
    59                     }
    60                     else
    61                         break;
    62                 }
    63                 else
    64                 {
    65                     s.push(items[i]);
    66                     break;
    67                 }
    68             }
    69         }
    70     }
    71     
    72     std::cout << "value : " << value << std::endl;
    73     
    74     std::cout << "items : ";
    75     while(!s.empty())
    76     {
    77         std::cout << s.top() << " ";
    78         s.pop();
    79     }
    80     std::cout << std::endl;
    81     
    82     
    83     return 0;
    84 }

    运行结果:

  • 相关阅读:
    vmware 上安装 gentoo
    有关网络编程
    【记录】Linux API钩子-文件打开
    在linux上实现DllMain + 共享库创建方法
    让程序在指定路径寻找库文件 + 库文件搜索顺序
    自定义协议解析
    修改bashrc,如何立即刷新
    Autoconf学习笔记
    ps命令输出,进程状态
    npm 使用 taobao 的镜像后,无法 login & publish
  • 原文地址:https://www.cnblogs.com/wanmeishenghuo/p/13494499.html
Copyright © 2011-2022 走看看