acm——贪心算法(背包问题)

来源:互联网 发布:oltp是数据挖掘吗 编辑:程序博客网 时间:2024/06/01 19:14

问题描述:

 包可以承受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;}