贪心算法

贪心算法啊

(1)换硬币购物问题

    #include<iostream>  
    #include<algorithm>  
    using namespace std;  
    int m,n,num[1010];  
    int main()
    {  
        cin>>m>>n;  
        int i,j,sum=0,ans=0;  
        for(i=1;i<=n;i++)
        {
        cin>>num[i];  
        }
        sort(num+1,num+1+n);  
        if(num[1]!=1)
        {  
            cout<<-1;  
            return 0;  
        }  
        while(true)
        {  
            if(sum>=m)
            {  
                cout<<ans;
                return 0;  
            }  
            for(i=n;i>=1;i--)  
                if(num[i]<=sum+1)
                {
                   sum+=num[i];
                   ans++;
                   break;
                }  
        }  
        return 0;
    }

(2)java bean贪心问题

    package 贪心算法;
    import java.text.DecimalFormat;
    import  java.util.Scanner;
    public class JavaBean贪心算法贪javabing {
    /**
     * FatMouse准备了M磅的猫粮,准备与守卫包含他最喜欢的食物JavaBean的仓库的猫交易。
    仓库有N个房间。 第i个房间包含J [i]磅的JavaBeans并且需要F [i]磅的猫粮。
     FatMouse不需要为房间里的所有JavaBeans进行交易,相反,如果他支付F [i] *a%磅的猫粮,他可能会得到J [i] *a%磅的JavaBeans。 
     这是一个实数。 现在他正在为你分配这个功课:告诉他他可以获得的最大JavaBeans数量。
     
     5 3
    7 2
    4 3
    5 2
    13.333
     * @param args
     */
    	public static void main(String[] args) {
    		 DecimalFormat df2 = new DecimalFormat("#.000");
    		Scanner  cin=new  Scanner(System.in);
    		int  m;
    		int i,j,n;
    		double []a=new double[1000];
    		double []b=new double[1000];
    		double []c=new double[1000];
    		double sum=0,t;
    		while(cin.hasNext())
    		{
    			m=cin.nextInt();
    			n=cin.nextInt();
    			if(m!=-1&&n!=-1){
				
			for(i=0;i<n;i++)
			{
				a[i]=cin.nextDouble();
				b[i]=cin.nextDouble();
			}
			for(i=0;i<n;i++)
				if(b[i]==0)
				{
					sum=sum+a[i];b[i]=-1;
				}
			
		for(i=0;i<n;i++)
		
			c[i]=a[i]/b[i];
		
		for(j=0;j<n-1;j++)
		
			for(i=0;i<n-1-j;i++)
			{
				if(c[i]<c[i+1])
				{
					t=c[i];c[i]=c[i+1];c[i+1]=t;
					t=a[i];a[i]=a[i+1];a[i+1]=t;
					t=b[i];b[i]=b[i+1];b[i+1]=t;
				}
			}
		
		for(i=0;i<n;i++)
		{
			if(b[i]!=-1)
			{
				if(m>=b[i]){
					m=(int) (m-b[i]);
					sum=sum+a[i];
				}else{
					sum=sum+c[i]*m;break;
				}
			}
		}
		System.out.println(df2.format(sum));
		sum=0;
			}
    	}
    	}
    	}

(3)01背包最大单位价值量

    package 贪心算法;
    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.InputStreamReader;
    import java.util.*;
     
    public class Main背包单位价值问题 {
        private static class Node {
            double v;
            double w;
            double vw;
        }
     
    private static class Reader {
        static BufferedReader reader;
        static StringTokenizer tokenizer;
 
        static void init(InputStream input) {
            reader = new BufferedReader(
                    new InputStreamReader(input));
            tokenizer = new StringTokenizer("");
        }
 
      
        static String next() throws IOException {
            while (!tokenizer.hasMoreTokens()) {
                
                tokenizer = new StringTokenizer(
                        reader.readLine());
            }
            return tokenizer.nextToken();
        }
 
        static int nextInt() throws IOException {
            return Integer.parseInt(next());
        }
 
        static double nextDouble() throws IOException {
            return Double.parseDouble(next());
        }
    }
 
    public static void main(String[] args) {
        try {
            Reader.init(System.in);
            while (true) {
                int m = Reader.nextInt();
                int n = Reader.nextInt();
                if (n == -1 && m == -1) {
                    break;
                }
                List<Node> list = new ArrayList<Node>();
                for(int i = 1;i <= n;i++){
                    Node node = new Node();
                    node.v = Reader.nextDouble();
                    node.w = Reader.nextDouble();
                    node.vw = node.v/node.w;
                    list.add(node);
                }
                Collections.sort(list, new Comparator<Node>() {
                    @Override
                    public int compare(Node o1, Node o2) {
                        if(o2.vw > o1.vw){
                            return 1;
                        }
                        else if(o2.vw < o1.vw){
                            return -1;
                        }
                        else
                            return 0;
                    }
                });
                double count = 0 ;
                for(int i = 0; i < list.size();i++){
                    Node node = list.get(i);
                    if(m <= 0)
                        break;
                    else{
                        if(m - node.w >= 0){
                            count += node.v;
                            m -= node.w;
                        }
                        else{
                            count += m/node.w*node.v;
                            m = 0;
                        }
                    }
                }
                System.out.printf("%.3f\r\n",count);
            }
        }catch (Exception e){
 
        }
    }
    }

(4)贪心算法活动安排问题

     package 贪心算法;
    import java.util.Scanner;
    public class Main活动安排问题 {
    	public static void main(String[] args) {
    	Scanner cin=new Scanner(System.in);
    	while(cin.hasNext())
    	{
         //int num=cin.nextInt();
         //for(int h=0;h<num;h++)
         //{
        	 int m=cin.nextInt();
        	 int s[]=new int[m+1];
        	 int []f=new int[m+1];
        	 boolean []a=new boolean[m+1];
        	 for(int j=1;j<=m;j++)
        	 {
        		 s[j]=cin.nextInt();
        	 }
        	 for(int k=1;k<=m;k++)
        	 {
        		 f[k]=cin.nextInt();
        	 }
    	int n=s.length-1;
    	int count=1;
    	a[1]=true;
    	int j=1;
    	for(int i=2;i<=n;i++)
    	{
    		if(s[i]>=f[j])
    		{
    			a[i]=true;
    			j=i;
    			count++;
    		}else{
    			a[i]=false;
    		}
    	}
    	System.out.println(count);
    	for(int i=1;i<=n;i++)
    	{
    		if(a[i]==true)
    		{
    			System.out.println(i+" ");
    		}
    	}
         }
        System.out.println(); 
    }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Tronhon

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值