//Author:FF-W
//Date:25, Sep, 2018
//Purpose: 0-1背包问题(动态规划)
#include <iostream>
#include<algorithm>
using namespace std;
typedef struct
{
int value;
int weight;
int no;
bool selected;
}item;
void item_arrange(int**itemArrange,item*itemArray,int itemNumber,int weightMax)
{
for(int i=0;i<itemNumber+1;i++)
{
for(int j=0;j<weightMax+1;j++)
{
if(i==0||j==0){
itemArrange[i][j]=0;
}
else if((itemArray[i].weight)>j){
itemArrange[i][j]=itemArrange[i-1][j];
}
else{
itemArrange[i][j]=max(itemArrange[i-1][j],itemArrange[i-1][j-itemArray[i].weight]+itemArray[i].value);
}
}
}
/*
for(int i=0;i<itemNumber+1;i++)
{
for(int j=0;j<weightMax+1;j++)
{
cout<<itemArrange[i][j]<<" ";
}
cout<<endl;
}*/
}
void get_itemlist(int**itemArrange,item*itemArray,int itemNumber,int weightMax){
int j=weightMax;
for(int i=itemNumber;i>0;i--)
{
if(itemArrange[i][j]!=itemArrange[i-1][j])
{
itemArray[i].selected=true;
j-=itemArray[i].weight;
}
}
}
void print_itemlist(item*itemArray,int itemNuber)
{
for(int i=0;i<itemNuber+1;i++){
if(itemArray[i].selected){
cout<<itemArray[i].no<<" ";
}
}
}
int main()
{
int weightMax;
cout<<"输入背包最大承重:";
cin>>weightMax;
int itemNumber;
cout<<"输入物品总个数:";
cin>>itemNumber;
cout<<"输入物品价值和重量:";
item itemArray[itemNumber+1];
int** itemArrange=new int*[itemNumber+1];
for(int i=0;i<itemNumber+1;i++)
{
itemArrange[i]=new int[weightMax+1];
}
itemArray[0].selected=false;
for(int i=1;i<itemNumber+1;i++)
{
cin>>itemArray[i].value>>itemArray[i].weight;
itemArray[i].no=i;
itemArray[i].selected=false;
}
item_arrange(itemArrange,itemArray,itemNumber,weightMax);
get_itemlist(itemArrange,itemArray,itemNumber,weightMax);
cout<<"物品选择序列为:";
print_itemlist(itemArray,itemNumber);
return 0;
}
0-1背包问题(动态规划)
最新推荐文章于 2022-12-26 09:53:07 发布