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; }