贪心算法——背包问题

题目:

给定n种物品和一个背包。物品i的重量是Wi,其价值为Vi,背包的容量为C。应如何选择装入背包的物品,使得装入背包中物品的总价值最大? 

#include<iostream>

using namespace std;

int max(int a,int b)

{

if(a>b)

return a;

else

return b;

}

void Knapsack(int *v,int *w,int *x,int c,int n,int m[8][100] )

{

int i,j;

for(j=0;j<c;j++)

{

if(j<w[n])

m[n][j]=0;

else

m[n][j]=v[n];

}

for(i=n-1;i>=1;i--)

{

for(j=w[i];j<=c;j++)

m[i][j]=max(m[i+1][j],m[i+1][j-w[i]]+v[i]);

}

for(i=1;i<=n;i++)

{

if(m[i][c]==m[i+1][c])

x[i]=0;

else

{

x[i]=1;

c=c-w[i];

}

}

x[n]=(m[n][c])?1:0;

return;

}

int main()

{

int i=0;

int n=7;

int w[]={0,2,3,5,7,1,4,1};

int v[]={0,9,5,9,7,6,8,3};

int x[]={0,0,0,0,0,0,0,0};

cout<<"物品总数为:7"<<endl;

cout<<"物品的重量和价值分别为:"<<endl;

cout<<"重量 价值"<<endl;

for(i=1;i<=n;i++)

cout<<" "<<w[i]<<" "<<v[i]<<endl;

int m=15;

int arry[8][100]={0};

Knapsack(v,w,x,m,7,arry);

cout<<"贪心算法的解为:"<<endl;

for(i=1;i<=n;i++)

{

if(i==1)

cout<<x[i];

else

cout<<" "<<x[i];

}

cout<<endl;

return 0;

}

阅读更多
换一批

没有更多推荐了,返回首页