/*
有num件物品和一个容量为P_SIZE的背包。第i件物品的重量是weight[i],价值是value[i]。
求解将哪些物品装入背包可使价值总和最大。
特点:每种物品仅有一件,可以选择放或不放。
f[i][P_SIZE] = max(f[i-1][j], f[i-1][j-weight[i]] + value[i]);
方程之中,现在需要放置的是第i件物品,这件物品的体积是weight[i],价值是value[i],
因此f[i-1][P_SIZE]代表的就是不将这件物品放入背包,
而f[i-1][P_SIZE-weight[i]]+value[i]则是代表将第i件放入背包之后的总价值,比较两者的价值,得出最大的价值存入现在的背包之中
*/
#include <math.h>
#include <iostream>
#include <iomanip>
using namespace std;
void package01();
int max(int a, int b)
{
if (a>b)
return a;
return b;
}
int main(int argc, char *argv[])
{
const int num = 6;
int weight[num] = {2,3,1,4,6,5};
int value[num] = {5,6,5,1,19,7};
const int P_SIZE = 10;
int f[num+1][P_SIZE+1]={0};
for (int i=1; i<=num; ++i)
{
for(int j=P_SIZE; j >= weight[i-1]; j--)
{
if (i==1) //put first thing to package
{
f[i][j]=value[i-1];
}
else
{ //value[i-1] 代表value的第i个元素
f[i][j] = max(f[i-1][j], f[i-1][j-weight[i-1]] + value[i-1]);
}
}
}
for (int i=0; i<=num; ++i)
{
for (int j=0; j<=P_SIZE; ++j)
{
std::cout<<setw(4)<<f[i][j]<<" "; //最后一个元素是结果
}
cout<<endl;
}
cout<<"selected item:"<<endl;
int i=num;
int j=P_SIZE;
while(i>0 && j>0)
{
if(f[i][j] == f[i-1][j-weight[i-1]] +value[i-1]) //说明value[i-1]被选中了
{
//qDebug()<<"i-1="<<i-1<<"j="<<j-weight[i-1];
cout<<"weight:"<<weight[i-1]<<" value:"<<value[i-1]<<endl;
j=j-weight[i-1];
}
i--;
}
return 0;
}
01背包问题
最新推荐文章于 2024-09-11 14:03:06 发布