• POJ 3040(Allowance)


    题目链接:http://poj.org/problem?id=3040

    题意:将不同面值的金币分成x份,每份的数量至少为c ,  求x的最大值

    思路:1. 面值大于 c 的只能单独为一份;

       2. 优先考虑取出面值较大的;

       3.取出面值较大的后考虑有小到的面值次序取出金币拼凑,直到刚好等于或超过 c ;

       4.直到剩下的金币不能拼凑成 c ;

    ac代码:

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    #include <cstdio>
    using namespace std;
    
    int N,C,total=0,temp=0;
    struct Coin{
        int mianzhi;
        int num;
    }coins[25];
    
    bool Cmp(const Coin& a,const Coin& b){
        return a.mianzhi>b.mianzhi;
    }
    
    int main(void){    
        cin>>N>>C;
        for(int i=0;i<N;i++){
            scanf("%d%d",&coins[i].mianzhi,&coins[i].num);
            // getchar();
        }
        sort(coins,coins+N,Cmp);
    
        // 选出面值大于或等于C的
        for(int i=0;i<N;i++){
            if(coins[i].mianzhi>=C){
                total+=coins[i].num;
                temp=i+1;
            }
            else    break;
        }
    
        // temp++;
        while(1){
            int now=0;
            for(int i=temp;i<N;i++){
                while(coins[i].num>0&&now+coins[i].mianzhi<=C){
                    now+=coins[i].mianzhi;
                    coins[i].num--;
                }
            }    
            for(int i=N-1;i>=temp;i--){
                while(now<C&&coins[i].num){
                    coins[i].num--;
                    now+=coins[i].mianzhi;
                }
            }
            if(now<C)
                break;
            total++;        
        }
        cout<<total<<endl;
    
        return 0;
    }
    View Code
  • 相关阅读:
    scott登录查询常用语句
    Oracle服务端及客户端安装
    SVN简单使用
    dos命令--查询进程
    第二周学习总结
    第一周学习总结
    虚拟机安装教程及网络连接方式的解释
    两天学习总结
    方差
    thinkphp 总结 转
  • 原文地址:https://www.cnblogs.com/jaszzz/p/12563227.html
Copyright © 2020-2023  润新知