用贪心算法求解的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;
}
}
#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;
}
}
相关文章推荐
- 用动态规划算法求解的0-1背包C++源代码
- 用贪心算法求解普通背包问题的C++代码
- 贪心算法运用于背包问题(C++实现)
- 背包问题,动态规划求解,matlab代码,c++代码
- 算法导论第16章 贪心算法-0-1背包问题—动态规划求解
- C++ 贪心算法部分背包问题
- 用贪心算法求解背包问题
- 0-1背包问题求解归纳(动态规划法,贪心算法,回溯法,分治法和分支界限法)__更新到完整
- 算法设计的背包问题-------------用贪心算法求解
- 贪心算法求解存放磁带问题(vector数组键盘输入,C++sort函数)
- 用c++代码实现贪心算法求解最短路径问题
- 0-1背包问题蛮力法求解(c++版本)
- (C++)分支限界法求解背包问题
- 用分支定界的方法求解变形的背包问题(c++版本)
- 【贪心算法】背包问题 C++
- (C++)分支限界法求解背包问题
- 简易学生信息管理系统(c++源代码)
- C/C++广度优先搜索模拟迷宫求解问题
- C++利用队列(Queue)求解迷宫(Maze)中指定起点和终点间是否有最短路径,如果有的话输出所需步数,如果没有输出
- C++求解近似比例(比例的压缩)