C++动态规划之背包问题解决方法

 更新时间:2015年04月20日 12:21:11   作者:司青  
这篇文章主要介绍了C++动态规划之背包问题解决方法,实例分析了背包问题的原理与C++实现技巧,具有一定参考借鉴价值,需要的朋友可以参考下

本文实例讲述了C++动态规划之背包问题解决方法。分享给大家供大家参考。具体分析如下:

问题描述:

背包的最大容量为W,有N件物品,每件物品重量为w,价值为p,怎样选择物品能使得背包里的物品价值最大?

输入:
10 3   (W,N)
4 5   (w,p)
6 7   (w,p)
8 9   (w,p)

实现代码:

#include <stdio.h>
#define THING  20
#define WEIGHT 100
int arr[THING][WEIGHT];
/* 背包容量为weight,依次尝试1 - thing 物品时的最大价值 */
int price[100]; /* 物品价格表 */
int weight[100]; /* 物品重量表 */
 int main()
{
 int i,j;
 int max_weight,max_thing;
  /* 初始化 */
 for(i = 0 ; i < THING ; ++i)
 {
 for(j = 0 ; j < WEIGHT ; ++j)
  arr[i][j] = 0;
 }
  /* 读入数据 */
 scanf("%d%d",&max_weight,&max_thing);
 for(i = 1 ; i <= max_thing ; ++i)
 {
 scanf("%d%d",&weight[i],&price[i]);
 }
  /* 计算 */
 for(i = 1 ; i <= max_thing ; ++i)
 {
 for(j = 1 ; j <= max_weight ; ++j)
 {
  if(j >= weight[i])
  /* 如果当前物品的容量小于背包容量
  (当前物品能放进去) */
  {
  /* 如果当前物品的价值 + 背包剩余空间能放进去的物品价值
  (之间计算过的最佳方案) */
  /* 大于上一次选择的价值,则放入当前物品 */
  if(price[i] + arr[i - 1][j - weight[i]] > arr[i - 1][j])
   arr[i][j] = price[i] + arr[i - 1][j - weight[i]];
  else /* 否则继续沿用上次的选择 */
   arr[i][j] = arr[i - 1][j];
  }
  else /* 当前物品放不进去,继续沿用上次的选择 */
  arr[i][j] = arr[i - 1][j];
 }
 }
  /* 输出最优解 */
 printf("max weight : %d\n",arr[max_thing][max_weight]);
  /* 输出所有子解 arr[][] */
 for(i = 0 ; i <= max_thing ; ++i)
 {
 for(j = 0 ; j <= max_weight ; ++j)
  printf("%3d",arr[i][j]);
 printf("\n");
 }
  return 0;
}

希望本文所述对大家的C++程序设计有所帮助。

相关文章

  • C++控制台实现随机生成路径迷宫游戏

    C++控制台实现随机生成路径迷宫游戏

    这篇文章主要为大家详细介绍了C++控制台实现随机生成路径迷宫游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-05-05
  • 基于QT实现自定义温度计的示例代码

    基于QT实现自定义温度计的示例代码

    QT原生控件没有实现如仪表盘或者温度计的控件,只好自己实现,所以本文为大家介绍了如何利用qt实现自定义温度/湿度控件,感兴趣的小伙伴可以了解下
    2023-11-11
  • C++实现当前时间动态显示的方法

    C++实现当前时间动态显示的方法

    这篇文章主要介绍了C++实现当前时间动态显示的方法,涉及C++时间操作及Sleep方法的使用,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-07-07
  • C++实现LeetCode(50.求x的n次方)

    C++实现LeetCode(50.求x的n次方)

    这篇文章主要介绍了C++实现LeetCode(50.求x的n次方),本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-07-07
  • 详解C++的反调试技术与绕过手法

    详解C++的反调试技术与绕过手法

    反调试技术,恶意代码会用它识别自身是否被调试,或者让调试器失效,给反病毒工程师们制造麻烦,拉长提取特征码的时间线,本章将具体总结常见的反调试基础的实现原理以及如何过掉这些反调试手段,从而让我们能够继续分析恶意代码
    2021-06-06
  • C++实现类似延时停顿的打字效果

    C++实现类似延时停顿的打字效果

    这篇文章主要介绍的是使用C++实现类似延时停顿的打字效果的代码,非常的简单,推荐给大家,有需要的小伙伴可以参考下。
    2015-03-03
  • C++ 和 C# 中的 lambda的方法技巧

    C++ 和 C# 中的 lambda的方法技巧

    这篇文章主要介绍了C++ 和 C# 中的 lambda的方法技巧,文章围绕主题展开详细的内容介绍,具有一定的参考价值,感兴趣的小伙伴可以参考一下
    2022-06-06
  • C语言中continue的用法详解

    C语言中continue的用法详解

    在C语言当中的continue和break语句是有一些类似的,但是它并不是强制进行终止的,下面这篇文章主要给大家介绍了关于C语言中continue用法的相关资料,需要的朋友可以参考下
    2022-11-11
  • C++ primer基础之容器insert

    C++ primer基础之容器insert

    这篇文章主要介绍了C++ primer基础之容器insert的相关资料,需要的朋友可以参考下
    2017-02-02
  • 解析C++中的虚拟函数及其静态类型和动态类型

    解析C++中的虚拟函数及其静态类型和动态类型

    虚拟函数(Visual Function)亦常被成为虚函数,是C++中的一个重要特性,本文我们就来解析C++中的虚拟函数及其静态类型和动态类型
    2016-06-06

最新评论