您的位置:首页 > 编程语言 > C语言/C++

用贪心算法求解的0-1背包C++源代码

2009-11-27 19:03 330 查看
贪心算法

#include<iostream.h>
#define M 100 //最多物品数
void sort (int n,double p[M],double s[M]) //按价值密度排序
{
int j,h,k;
double temp1,temp2,temp3,c[M];
for(k=1;k<=n;k++)
c[k]=p[k]/s[k];
for(h=1;h<n;h++)
for(j=1;j<=n-h;j++)
if(c[j]<c[j+1])
{
temp1=p[j];p[j]=p[j+1];p[j+1]=temp1;
temp2=s[j];s[j]=s[j+1];s[j+1]=temp2;
temp3=c[j];c[j]=c[j+1];c[j+1]=temp3;
}
};
void knapsack(int n,int C,double p[M],double s[M],int x[M])
{
double c1; //c1为背包剩余可装载重量
int i;
sort(n,p,s); //物品按价值密度排序
c1=C;
for(i=1;i<=n;i++)
{
if(s[i]>c1)break;
x[i]=1; //x[i]为1时,物品i在解中
c1=c1-s[i];
}
};
void main()
{
int n,i,C,x[M];
char ch;
double p[M],s[M],totalp=0,totals=0;
while(1)
{
cout<<"请输入物体个数n:";
cin>>n ;
cout<<endl;
cout<<"请输入背包容量C:";
cin>>C;
cout<<endl;
for(i=1;i<=n;i++)
x[i]=0; //物品选择情况表初始化为0
cout<<"请依次输入物品的重量:"<<endl;
for(i=1;i<=n;i++)
cin>>s[i];
cout<<endl;
cout<<"请依次输入物品的价值:"<<endl;
for(i=1;i<=n;i++)
cin>>p[i];
cout<<endl;
knapsack (n,C,p,s,x);
cout<<"结果表示为:"<<endl;
for(i=1;i<=n;i++)
cout<<"第"<<i<<"个物体大小:"<< s[i]<<" "<<endl;
cout<<endl;
for(i=1;i<=n;i++)
cout<<"第"<<i<<"个物体价值"<< p[i]<<" "<<endl;
cout<<endl;
cout<<"向量表示:"<<" ( ";
for(i=1;i<=n;i++)
{
cout<<x[i]<<" ";
if(x[i]==1)
{
totals=totals+s[i];
totalp=totalp+p[i];
}
}
cout<<")"<<endl;
cout<<"背包的总重量为:"<<totals<<endl; //背包所装载总重量
cout<<"背包的总价值为:"<<totalp<<endl; //背包的总价值
cout<<"按Y或y继续操作,否则按任意键"<<endl;
cin>>ch;
if(ch=='Y'||ch=='y')
continue;
else
break;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: