贪心法求解背包问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/arthu6/article/details/83447676

问题描述:7个物品,重为{2,3,5,7,1,4,1},价值为{10,5,15,7,6,18,3},背包容量W=15,求最优解。

思路:将物品按单重价值降序排列,装满为止。

C++代码:

#include<iostream>
#include<iomanip>
using namespace std;

int KnapSack(int w[],int v[],int n,int C)
{
    double x[7]={0};
    int i;
    int maxValue=0;
    for( i=0;w[i]<C;i++)
    {
        x[i]=1;
        maxValue+=v[i];
        C-=w[i];
    }
    x[i]=(double)C/w[i];
    maxValue+=v[i]*x[i];
    cout<<"取物信息:";
    for(i=0;i<7;i++) cout<<x[i]<<" ";
    cout<<endl;
    return maxValue;
}

int main()
{
	int w[7]={2,3,5,7,1,4,1};
	int v[7]={10,5,15,7,6,18,3};
	int C=15;
    int V;
    for(int i=0;i<7;i++)
        for(int j=i+1;j<7;j++)
    {
        if(v[i]/w[i]<v[j]/w[j])
        {
            int tv,tw;
            tv=v[j];v[j]=v[i];v[i]=tv;
            tw=w[j];w[j]=w[i];w[i]=tw;
        }
    }
    cout<<"单重价值降序价值:";
    for(int i=0;i<7;i++)
        cout<<setw(2)<<v[i]<<" ";
    cout<<endl;
    cout<<"单重价值降序重量:";
    for(int i=0;i<7;i++)
        cout<<setw(2)<<w[i]<<" ";
    cout<<endl;
    V=KnapSack(w,v,7,C);
    cout<<"最优解:"<<V<<endl;
	return 0;
}

截图:

猜你喜欢

转载自blog.csdn.net/arthu6/article/details/83447676