若果把背包问题 直接按价值降序排列 和 按单位质量价值降序排列 两者的结果进行比较,能不能得出最优解?如果不能,在不涉及递归和穷举的前提下,有什么方法可以得出最优解?
3条回答 默认 最新
- lbcab 2016-05-19 04:42关注
选取价值最大者。反例:
W=30
物品:A B C
重量:28 12 12
价值:30 20 20
根据策略,首先选取物品A,接下来就无法再选取了,可是,选取B、C则更好。
选取单位重量价值最大的物品。反例:
W=30
物品:A B C
重量:28 20 10
价值:28 20 10
根据策略,三种物品单位重量价值一样,程序无法依据现有策略作出判断.使用动态规划来处理背包问题:
背包的状态转换方程 f[i,j] = Max{ f[i-1,j-Wi]+Pi( j >= Wi ), f[i-1,j] }
f[i,j]表示在前i件物品中选择若干件放在承重为 j 的背包中,可以取得的最大价值。
Pi表示第i件物品的价值。参考代码:
#include <iostream> #include <vector> using namespace std; //物品类 class packitem{ public: packitem(int w, int v):weight(w), value(v){} int weight; int value; }; int matrix[5][10] = {0}; int maxValue(int matrix[][10], vector<packitem*> vecpack, int bagsize, int bagweight){ for(int i = bagsize - 1; i >= 0; --i){ for(int j = 0; j < bagweight; ++j){ packitem item = *vecpack[i]; if(item.weight > j + 1){ //当前背包不能装下此物品 if(0 == j){ matrix[i][j] = 0; } else{ matrix[i][j] = matrix[i + 1][j]; } } else{ int valueInbag = 0; if( i == bagsize - 1|| j - item.weight + 1 < 0){ matrix[i][j] = item.value; continue; } else{ int tmp = 0; if (j - item.weight >= 0) tmp = j - item.weight; valueInbag = matrix[i + 1][tmp] + item.value; matrix[i][j] = max(matrix[i + 1][j], valueInbag); } } } } for(int i = 0; i < bagsize; ++i){ for(int j = 0; j < bagweight; ++j){ cout<<matrix[i][j]<<" "; } cout<<endl; } return matrix[0][bagweight - 1]; } int main() { vector<packitem*> tmp; int w[] = {2,2,6,5,4}; int v[] = {6,3,5,4,6}; int bagweight = 10; for(int i = 0; i < 5; ++i){ tmp.push_back(new packitem(w[i], v[i])); } int result = maxValue(matrix, tmp, 5, bagweight); for(int i = 0; i < 5; ++i){ delete tmp[i]; } tmp.clear(); cout<<result<<endl; return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 无用评论 打赏 举报
悬赏问题
- ¥15 delta降尺度计算的一些细节,有偿
- ¥15 Arduino红外遥控代码有问题
- ¥15 数值计算离散正交多项式
- ¥30 数值计算均差系数编程
- ¥15 redis-full-check比较 两个集群的数据出错
- ¥15 Matlab编程问题
- ¥15 训练的多模态特征融合模型准确度很低怎么办
- ¥15 kylin启动报错log4j类冲突
- ¥15 超声波模块测距控制点灯,灯的闪烁很不稳定,经过调试发现测的距离偏大
- ¥15 import arcpy出现importing _arcgisscripting 找不到相关程序