• 购物单(算法课设题目)(动态规划,深度优先,背包问题)


    * \ 小明的妈妈奖励他N元,小明开始做预算,给出m件物品的价格以及重要度,
     * \ 小明想在不超过N元的前提下,使得购买的物品的价格与重要度的乘积
     * \ 的总和最大

     * anaysis:
                明显可以定义出一个结构体来存储每件商品的信息,然后就可以用深度优先搜索
                算法进行选择
       DFS 函数:  DFS_select(int index,int sum_price,int sum_value);

    1. /** \brief
    2. *
    3. * \ 小明的妈妈奖励他N元,小明开始做预算,给出m件物品的价格以及重要度,
    4. * \ 小明想在不超过N元的前提下,使得购买的物品的价格与重要度的乘积
    5. * \ 的总和最大
    6. * anaysis:
    7. 明显可以定义出一个结构体来存储每件商品的信息,然后就可以用深度优先搜索
    8. 算法进行选择
    9. DFS 函数: DFS_select(int index,int sum_price,int sum_value);
    10. data: 120
    11. 5
    12. 30 40 55 25 80
    13. 5 4 5 3 4
    14. or
    15. 120
    16. 5
    17. 30 40 55 25 80
    18. 5 3 5 3 4
    19. */
    20. #include <iostream>
    21. #include <vector>
    22. using namespace std;
    23. struct item
    24. {
    25. int price,impor,value;
    26. };
    27. void DFS_select(int index,int sum_price,int sum_value);
    28. int money,item_size,max_value=-1;
    29. vector<item> items;
    30. vector<int> ans,temp;
    31. int main()
    32. {
    33. cout << "输入妈妈给小明多少钱:\n";
    34. int flag=0;
    35. do
    36. {
    37. if(flag)
    38. cout << "请重新输入正确的钱的数量:\n";
    39. flag=1;
    40. cin >> money;
    41. }while(money<0);
    42. cout << "输入商品的数量:\n";
    43. flag=0;
    44. do
    45. {
    46. if(flag)
    47. cout << "请重新输入正确的商品的数量:\n";
    48. flag=1;
    49. cin >> item_size;
    50. }while(item_size<=0);
    51. item temp;
    52. cout << "输入 " << item_size << " 件商品的价格:\n";
    53. for(int i=0;i<item_size;++i)
    54. {
    55. cin >> temp.price;
    56. items.push_back(temp);
    57. }
    58. cout << "输入 " << item_size << " 件商品的重要度:\n";
    59. for(int i=0;i<item_size;++i)
    60. {
    61. cin >> temp.impor;
    62. items[i].impor=temp.impor;
    63. items[i].value=temp.impor*items[i].price;
    64. }
    65. DFS_select(0,0,0);
    66. cout << "max_value is " << max_value << endl;
    67. cout << "select index of items are :\n";
    68. for(auto a:ans)
    69. cout << a+1 << ' '; //< 商品下标从1开始
    70. cout << endl;
    71. return 0;
    72. }
    73. void DFS_select(int index,int sum_price,int sum_value)
    74. {
    75. if(index>item_size||sum_price>money)
    76. return;
    77. if(sum_price<=money&&sum_value>max_value)
    78. {
    79. max_value=sum_value;
    80. ans=temp;
    81. }
    82. // 这儿我感觉是可以改进一下的
    83. // temp.push_back(index);
    84. // DFS_select(index+1,sum_price+items[index].price,sum_value+items[index].value);
    85. // temp.pop_back();
    86. // DFS_select(index+1,sum_price,sum_value);
    87. temp.push_back(index);
    88. if(sum_price+items[index].price<=money)
    89. DFS_select(index+1,sum_price+items[index].price,sum_value+items[index].value);
    90. temp.pop_back(); //< 回溯,不选择index号商品
    91. DFS_select(index+1,sum_price,sum_value);
    92. }

    * \  2)其实现在细细想来,这不就是属于背包问问题吗,emm,确实是这样,后面再用
         动态规划解决试试
    */

    /**
        动态规划 solution
    */

    /**
        1)用一维数组来存储状态信息,但显然这无法知道选择了哪几件商品,
          因此后面我用了二维数组来存储状态信息。

    1. /**
    2. * \ 2)其实现在细细想来,这不就是属于背包问问题吗,emm,确实是这样,后面再用
    3. 动态规划解决试试
    4. */
    5. /**
    6. 动态规划 solution
    7. */
    8. /**
    9. 1)用一维数组来存储状态信息,但显然这无法知道选择了哪几件商品,
    10. 因此后面我用了二维数组来存储状态信息。
    11. dp[i][v]=max(dp[i-1][v],dp[i-1][v-items[i].price]+items[i].value);
    12. 当dp[i][v]==dp[i-1][v]时,说明没选择第i件物品,否则选择了。
    13. */
    14. /**
    15. #include <iostream>
    16. #include <vector>
    17. #include <algorithm>
    18. #include <cstring>
    19. using namespace std;
    20. struct item
    21. {
    22. int price,impor,value;
    23. };
    24. int money,item_size,max_value=-1;
    25. vector<item> items;
    26. int main()
    27. {
    28. cout << "输入妈妈给小明多少钱:\n";
    29. int flag=0;
    30. do
    31. {
    32. if(flag)
    33. cout << "请重新输入正确的钱的数量:\n";
    34. flag=1;
    35. cin >> money;
    36. }while(money<0);
    37. cout << "输入商品的数量:\n";
    38. flag=0;
    39. do
    40. {
    41. if(flag)
    42. cout << "请重新输入正确的商品的数量:\n";
    43. flag=1;
    44. cin >> item_size;
    45. }while(item_size<=0);
    46. item temp;
    47. cout << "输入 " << item_size << " 件商品的价格:\n";
    48. for(int i=0;i<item_size;++i)
    49. {
    50. cin >> temp.price;
    51. items.push_back(temp);
    52. }
    53. cout << "输入 " << item_size << " 件商品的重要度:\n";
    54. for(int i=0;i<item_size;++i)
    55. {
    56. cin >> temp.impor;
    57. items[i].impor=temp.impor;
    58. items[i].value=temp.impor*items[i].price;
    59. }
    60. int dp[money+1];
    61. memset(dp,0,sizeof(dp));//边界设计
    62. for(int i=0;i<item_size;++i)
    63. for(int v=money;v>=items[i].price;--v)//应当是从右至今开始递推,和01背包问题一样
    64. {
    65. dp[v]=max(dp[v],dp[v-items[i].price]+items[i].value);
    66. }
    67. cout << dp[money] << endl;
    68. return 0;
    69. }
    70. */

    /**
        3)二维数组记录状态信息
        anaysis:
        状态设计:dp[i][v]表示选择前i件商品,花了v元的重要度;
        状态转移方程: dp[i][v]=max(dp[i-1][v],dp[i-1][v-items[i].price]+items[i].value);
          当dp[i][v]==dp[i-1][v]时,说明没选择第i件物品,否则选择了。
    */

    1. /**
    2. 3)二维数组记录状态信息
    3. anaysis:
    4. 状态设计:dp[i][v]表示选择前i件商品,花了v元的重要度;
    5. 状态转移方程: dp[i][v]=max(dp[i-1][v],dp[i-1][v-items[i].price]+items[i].value);
    6. 当dp[i][v]==dp[i-1][v]时,说明没选择第i件物品,否则选择了。
    7. */
    8. /**
    9. #include <iostream>
    10. #include <vector>
    11. #include <algorithm>
    12. #include <cstring>
    13. using namespace std;
    14. struct item
    15. {
    16. int price,impor,value;
    17. };
    18. int main()
    19. {
    20. int money,item_size;
    21. cout << "输入妈妈给小明多少钱:\n";
    22. int flag=0;
    23. do
    24. {
    25. if(flag)
    26. cout << "请重新输入正确的钱的数量:\n";
    27. flag=1;
    28. cin >> money;
    29. }while(money<0);
    30. cout << "输入商品的数量:\n";
    31. flag=0;
    32. do
    33. {
    34. if(flag)
    35. cout << "请重新输入正确的商品的数量:\n";
    36. flag=1;
    37. cin >> item_size;
    38. }while(item_size<=0);
    39. item infor;
    40. vector<item> items;
    41. cout << "输入 " << item_size << " 件商品的价格:\n";
    42. for(int i=0;i<item_size;++i)
    43. {
    44. cin >> infor.price;
    45. items.push_back(infor);
    46. }
    47. cout << "输入 " << item_size << " 件商品的重要度:\n";
    48. for(int i=0;i<item_size;++i)
    49. {
    50. cin >> infor.impor;
    51. items[i].impor=infor.impor;
    52. items[i].value=infor.impor*items[i].price;
    53. }
    54. int dp[item_size+1][money+1];
    55. for(int i=0;i<=money;++i)
    56. dp[0][i]=0; //边界设计
    57. for(int i=1;i<=item_size;++i)
    58. {
    59. for(int v=0;v<items[i-1].price;++v)
    60. dp[i][v]=dp[i-1][v];
    61. for(int v=items[i-1].price;v<=money;++v)
    62. {
    63. dp[i][v]=max(dp[i-1][v],dp[i-1][v-items[i-1].price]+items[i-1].value);
    64. }
    65. }
    66. int choose[item_size+1],temp=money;
    67. for(int i=item_size;i>0;--i)
    68. {
    69. if(dp[i][temp]==dp[i-1][temp])
    70. choose[i]=0;
    71. else
    72. {
    73. choose[i]=1;
    74. temp-=items[i-1].price;
    75. }
    76. }
    77. cout << "max_value is " << dp[item_size][money] << endl;
    78. cout << "select index of items are :\n";
    79. for(int i=1;i<=item_size;++i)
    80. if(choose[i]==1)
    81. cout << i << ' '; //< 商品下标从1开始
    82. cout << endl;
    83. return 0;
    84. }
    85. */


    /**
        再编码:商品下标从1开始,思想和上一个代码一摸一样;
    */

    1. /**
    2. 再编码:商品下标从1开始,思想和上一个代码一摸一样;
    3. */
    4. #include <iostream>
    5. #include <vector>
    6. #include <algorithm>
    7. #include <cstring>
    8. using namespace std;
    9. struct item
    10. {
    11. int price,impor,value;
    12. };
    13. int main()
    14. {
    15. int money,item_size;
    16. cout << "输入妈妈给小明多少钱:\n";
    17. int flag=0;
    18. do
    19. {
    20. if(flag)
    21. cout << "请重新输入正确的钱的数量:\n";
    22. flag=1;
    23. cin >> money;
    24. }while(money<0);
    25. cout << "输入商品的数量:\n";
    26. flag=0;
    27. do
    28. {
    29. if(flag)
    30. cout << "请重新输入正确的商品的数量:\n";
    31. flag=1;
    32. cin >> item_size;
    33. }while(item_size<=0);
    34. //item infor;
    35. vector<item> items(item_size+1);
    36. cout << "输入 " << item_size << " 件商品的价格:\n";
    37. for(int i=1;i<=item_size;++i)
    38. {
    39. cin >> items[i].price;
    40. }
    41. cout << "输入 " << item_size << " 件商品的重要度:\n";
    42. for(int i=1;i<=item_size;++i)
    43. {
    44. cin >> items[i].impor;
    45. items[i].value=items[i].impor*items[i].price;
    46. }
    47. int dp[item_size+1][money+1];
    48. for(int i=0;i<=money;++i)
    49. dp[0][i]=0; //边界设计
    50. for(int i=1;i<=item_size;++i)
    51. {
    52. for(int v=0;v<items[i].price;++v)
    53. dp[i][v]=dp[i-1][v];
    54. for(int v=items[i].price;v<=money;++v)
    55. {
    56. dp[i][v]=max(dp[i-1][v],dp[i-1][v-items[i].price]+items[i].value);
    57. }
    58. }
    59. int choose[item_size+1],temp=money;
    60. for(int i=item_size;i>0;--i)
    61. {
    62. if(dp[i][temp]==dp[i-1][temp])
    63. choose[i]=0;
    64. else
    65. {
    66. choose[i]=1;
    67. temp-=items[i].price;
    68. }
    69. }
    70. cout << "max_value is " << dp[item_size][money] << endl;
    71. cout << "select index of items are :\n";
    72. for(int i=1;i<=item_size;++i)
    73. if(choose[i]==1)
    74. cout << i << ' '; //< 商品下标从1开始
    75. cout << endl;
    76. return 0;
    77. }

  • 相关阅读:
    Cmake的安装与使用
    穿越数字边疆:出海策略中的技术纬度探究
    MySQL的MHA高可用群集
    五分钟搭建开源ERP:Odoo,并实现公网远程访问
    360°全景环视「升级战」激化,前装供应链洗牌加速进行
    关于 vue2.x 的 $attrs 和 $listeners
    shell基本编程与trap的命令,用户在线例子
    基于springboot实现漫画网站管理系统项目【项目源码+论文说明】计算机毕业设计
    WEB前端应该学什么?学习到什么程度可以去找工作?附详细学习路线
    windows OpenCV(包含cuda)最简安装教程
  • 原文地址:https://blog.csdn.net/qq_51825761/article/details/125615506