贪心算法之背包问题

FatMouse准备了M磅的猫粮,准备和那些守卫仓库的猫进行交易,仓库里存放着他最喜欢的食物,JavaBean。

仓库有N个房间。第i个房间里有几磅爪哇肉,需要几磅猫食。FatMouse不需要对房间里的所有javabean进行交易,相反,如果他支付F (i) * %的猫粮,他可能会得到J[i]* %的javabean。a是实数。现在他正在给您分配这个作业:告诉他他能获得的最大javabean数量。

输入由多个测试用例组成。每个测试用例以包含两个非负整数M和N的行开始,然后接下来有N行,每一行分别包含两个非负整数J[i]和F[i]。最后一个测试用例后面跟着两个-1。所有整数都不大于1000。

Output

For each test case, print in a single line a real number accurate up to 3 decimal places, which is the maximum amount of JavaBeans that FatMouse can obtain. 

Sample Input

5 3 7 2 4 3 5 2 20 3 25 18 24 15 15 10 -1 -1

Sample Output

13.333 31.500

考虑性价比问题 从性价比高的考试考虑

#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;

int main()
{
    int m,n,j[1001]= {0},f[1001]= {0},i,flag;
    double k[1001]= {0},max,sum=0;
    while(1)
    {
        sum=0;
        cin>>m>>n;
        if(m==-1&&n==-1)
            break;
        for(i=1; i<=n; i++)
        {
          cin>>j[i]>>f[i];
            k[i]=(double)j[i]/f[i];
        }

        while(m>0)
        {
            max=k[1];
            flag=1;
            for(i=1;i<=n;i++)
            {
                if(k[i]!=0)
                    break;
            }
            if(i==n+1&&k[n]==0)
                break;
            for(i=1; i<=n; i++)
            {
                if(k[i]>=max)
                {
                    max=k[i];
                    flag=i;
                }

            }
            if(f[flag]>=m)
            {
                sum+=(double)j[flag]*(m/(double)f[flag]);
                m=0;
                 
            }
            else
            {
                m=m-f[flag];
                sum+=j[flag];
        
                k[flag]=0;
            }
        }
        printf("%.3f\n",sum);


    }
    return 0;
}


 XHD最多能带回多少价值的宝贝?

Input

输入包含多个测试实例,每个实例的第一行是两个整数v和n(v,n<100),分别表示口袋的容量和宝贝的种类,接着的n行每行包含2个整数pi和mi(0<pi,mi<10),分别表示某种宝贝的单价和对应的体积,v为0的时候结束输入。 

Output

对于每个测试实例,请输出XHD最多能取回多少价值的宝贝,每个实例的输出占一行。 

Sample Input

2 2 3 1 2 3 0

Sample Output

5

#include <iostream>
#include<stdio.h>
#include<algorithm>
using namespace std;

int main()
{
    int m,n,j[1001]= {0},f[1001]= {0},i,flag;
    double k[1001]= {0},max,sum=0;
    while(1)
    {
        sum=0;
        cin>>m;
        if(m==0)
            break;
        cin>>n;
        for(i=1; i<=n; i++)
        {
            cin>>j[i]>>f[i];
        }

        while(m>0)
        {
            max=j[1];
            flag=1;
            for(i=1; i<=n; i++)
            {
                if(j[i]!=0)
                    break;
            }
            if(i==n+1&&k[n]==0)
                break;
            for(i=1; i<=n; i++)
            {
                if(j[i]>=max)
                {
                    max=j[i];
                    flag=i;
                }

            }
            if(f[flag]>=m)
            {
                sum+=m*j[flag];
                m=0;
            }
            else
            {
                m=m-f[flag];
                sum+=j[flag]*f[flag];
                j[flag]=0;

            }
        }
        printf("%.0f\n",sum);
    }

    return 0;
}

猜你喜欢

转载自blog.csdn.net/sinat_39654987/article/details/81190739