博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态规划——0-1背包问题
阅读量:6767 次
发布时间:2019-06-26

本文共 2076 字,大约阅读时间需要 6 分钟。

/** * @brief 0_1_Knapsack  dynamic programming  * @author An * @data  2013.8.28                                                                  **//*** @problem  * @0-1背包问题: /*    给定n种物品和一个背包, 物品i的重量为wi,其价值为vi, 背包的容量为c,/*    应如何选择装入背包的物品,使得装入背包中的物品的总价值最大?/*    注:在选择装入背包的物品时,对物品i只有两种选择,/*        即装入或不装入背包。不能将物品i装入多次,也/*        不能只装入部分的物品i。 /* /* 1. 0-1背包问题的形式化描述: /*    给定c>0, wi>0, vi>0, 0<=i<=n,要求找到一个n元的 /*    0-1向量(x1, x2, ..., xn), 使得: /*            max sum_{i=1 to n} (vi*xi),且满足如下约束: /*        (1) sum_{i=1 to n} (wi*xi) <= c /*        (2) xi∈{0, 1}, 1<=i<=n /* * @                                                                 **/#include 
#define max( x, y ) ( x >= y ? x : y )using namespace std;void Knapsack( int *weight, double *value, int capacity, int n, bool *res, double **V );int main(){ int w[] = { 2, 2, 6, 5, 4 }; int v[] = { 6, 3, 5, 4, 6 }; int n = 5; int *weight = new int[n]; double *value = new double[n]; for ( int i = 0; i < n; ++i ) { weight[i] = w[i]; value[i] = v[i]; } int capacity = 10; // distribute memory bool *res = new bool[n]; double **V = new double*[n + 1]; for ( int i = 0; i <= n; ++i ) { V[i] = new double[capacity + 1]; } Knapsack( weight, value, capacity, n, res, V ); cout << "the max value is: " << V[n][capacity] << endl; cout << "the items in the knapsack is: "; for ( int i = 0; i != n; ++i ) { if ( res[i] ) { cout << i + 1 << ", "; } } cout << endl; return 0;}void Knapsack( int *weight, double *value, int capacity, int n, bool *res, double **V ){ // initialize 0 row and 0 column for ( int i = 0; i <= n; ++i ) { V[i][0] = 0; } for ( int j = 0; j <= capacity; ++j ) { V[0][j] = 0; } // calculate V[][] for ( int i = 1; i <= n; ++i ) { for ( int j = 1; j <=capacity; ++j ) { if ( j < weight[i - 1] ) { V[i][j] = V[i - 1][j]; } else { V[i][j] = max( V[i - 1][j], V[i - 1][j - weight[i - 1]] + value[i - 1] ); } } } int j = capacity; for ( int i = n; i > 0; --i ) { if ( V[i][j] > V[i - 1][j] ) { res[i - 1] = true; j -= weight[i - 1]; } else { res[i - 1] = false; } }}

转载地址:http://eiseo.baihongyu.com/

你可能感兴趣的文章
CentOS 6.5 安装JDK(包含卸载原有默认JDK)
查看>>
新手运营APP总结:把握住APP核心价值!
查看>>
你所不知道的SQL Server数据库启动过程,以及启动不起来的各种问题的分析及解决技巧...
查看>>
图片编辑器如何修理图片
查看>>
CAD小白要怎么在CAD中绘制圆环体
查看>>
颉一软件查理:数据变现,始于流通
查看>>
U盘坏了可以修复吗,这里有N种方法解决
查看>>
大数据怎么入门
查看>>
MT47H64M16NF-25EM相关参数介绍
查看>>
C# FileStream简单介绍和使用
查看>>
死磕 java同步系列之ReentrantLock源码解析(二)——条件锁
查看>>
My Brother Rabbit 游戏攻略,mybrotherrabbit豆子怎么获取?
查看>>
小白成长之路4
查看>>
我的友情链接
查看>>
掌握python机器学习-读书笔记2 (导入数据 && 数据描述)
查看>>
Centos7 mount/ rpm/ yum 软件仓库搭建
查看>>
Linux 系统 文件目录简介
查看>>
EC2上源安装vnstat
查看>>
正则表达式详解
查看>>
如何将网络迁移到云中
查看>>