包可以承受15kg重量,有五个物体质量依次为12, 2 ,1, 4, 1价格为4,2,2,10,1,求包所能装的最大价值是
问题分析:
1.先求出价值=格/重量,并用数组保存;
2.根据价值,对数组内元素进行从大到小排序
3.从价值高的开始装,此时,背包问题分为可切割背包问题和不可切割背包问题
- //可切割背包问题
- #include <iostream>
- using namespace std;
- class a
- {
- public:
- int p,w;
- double v;
- };
- int main()
- {
- a f[5],t;
- int i,j,s,m,n,sum;
- cin>>n;
- for(i=0;i<5;i++)
- {
- cin>>f[i].p>>f[i].w;
- f[i].v=(double)f[i].p/(double)f[i].w;
- }
- for(i=0;i<5;i++)
- for(j=0;j<5;j++)
- {
- if(f[i].v>f[j].v)
- {
- t=f[i];
- f[i]=f[j];
- f[j]=t;
- }
- }
- s=0;
- m=0;
- sum=0;
- for(i=0;i<5;i++)
- {
- s=s+f[i].w;
- if(n>s)
- {
- m=n-s;
- sum=sum+f[i].p;
- }
- else
- sum=sum+f[i].v*m;
- }
- cout<<sum<<endl;
- return 0;
- }
- 不可分割背包问题
- #include <iostream>
- using namespace std;
- class a
- {
- public:
- int p,w;
- double v;
- };
- int main()
- {
- a f[5],t;
- int i,j,s,m,n;
- cin>>n;
- for(i=0;i<5;i++)
- {
- cin>>f[i].p>>f[i].w;
- f[i].v=(double)f[i].p/(double)f[i].w;
- }
- for(i=0;i<5;i++)
- for(j=0;j<5;j++)
- {
- if(f[i].v>f[j].v)
- {
- t=f[i];
- f[i]=f[j];
- f[j]=t;
- }
- }
- s=0;
- m=0;
- for(i=0;i<5;i++)
- {
- s=s+f[i].w;
- if(s>n)break;
- m=m+f[i].p;
- }
- cout<<m<<endl;
- return 0;
- }
贪心算法(背包问题)
时间: 2024-10-10 18:06:38