0


/*
======0-1背包问题======
使用算法 动态规划
作者 程松
完成时间 2015/12/11 9:39
所用语言 C++
*/
#include
<iostream>
#include
<fstream>
#include
<cmath>
using namespace std;
const int MAX_CAPACITY = 10000;//定义的最大背包容量
const int MAX_THING_COUNT = 1000;//定义的最多的物体数目
int count;//物体的数目
int capacity;//背包的容量
int weight[MAX_THING_COUNT];//每个物体的重量
int value[MAX_THING_COUNT];//每个物体的价值
int maxvalue[MAX_CAPACITY][MAX_THING_COUNT];
//给定容量为i的背包去装前j个物体所能获得的最大价值,未知时为-1,用来做备忘录
void init(){
ifstream inputFile(
"E:\\Edit\\测试数据\\beibao8.in");//从文件读取数据
inputFile>>capacity>>count;//读入背包容量和物体数目
for(int i=0;i<count;++i){
inputFile
>>weight[i]>>value[i];//读入每个物体的重量及价值
}
inputFile.close();
for(int i=0;i<MAX_CAPACITY;++i)
for(int j=0;j<MAX_THING_COUNT;++j){
maxvalue[i][j]
=-1;//未知时为-1,用作备忘录
}
}
int MaxValue(int capacity,int count){
//声明返回的最大价值
int maxmemery;
//如果这个问题曾经计算过 [对应动态规划中的“做备忘录”]
if(maxvalue[capacity][count]!=-1)
maxmemery
= maxvalue[capacity][count];
else if(count==0){
//边界条件是最后一个编号为0的物体,若背包容量大于该物体重量
//则装入,否则不装入
if(capacity>=weight[count])
maxmemery
= value[count];
else
maxmemery
= 0;
}
else if(capacity>=weight[count]){
//如果当前的背包容量大于等于第count个物体的重量时
//通过状态转移方程求最大值,最优子结构
maxmemery = max(MaxValue(capacity,count-1),
MaxValue(capacity
-weight[count],count-1)+value[count]);
}
else{
//如果当前容量小与第count个物体重量时
//则不装入第count个物体,变为装前count-1个物体的最大价值
maxmemery = MaxValue(capacity,count-1);
}
maxvalue[capacity][count]
= maxmemery;//做备忘录
return maxmemery;
}
int main(){
init();
cout
<<MaxValue(capacity,count-1);
return 0;
}

 

本站声明
本文转载自:http://www.cnblogs.com/chengsong/p/5059036.html     作者:npusong     发布日期:2015/12/19     本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。


猜您在找
 
© 2014-2017 ITdaan.com 粤ICP备14056181号