贪心-poj-3040-Allowance
2024-10-19 06:27:52
题目链接:
http://poj.org/problem?id=3040
题目意思:
有n种(n<=20)面额的硬币,每种硬币面值能整除比它大的面值。给一个c,告诉每种硬币的面值和数量,求最多能够凑多少个c.
解题思路:
贪心。
对面值从大到下排序,当面值v>=c时,直接加上该种面值的数量一种就够了。
对于v<c的,从大到小,再不超过c的情况下,能装多少装多少,剩下的如果不为0,则从小到大,找到第一个>=left.
贪心原理:由于面值小的是面值大的的约数,在能够用面值大的时,如果用小的,就要用多个小的,而且还不能保证能凑到面值大的,可能更大。这样选择面值大的优。
代码:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<sstream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<map>
#include<set>
#include<stack>
#include<list>
#include<queue>
#include<ctime>
#include<bitset>
#define eps 1e-6
#define INF 0x3f3f3f3f
#define PI acos(-1.0)
#define ll __int64
#define LL long long
#define lson l,m,(rt<<1)
#define rson m+1,r,(rt<<1)|1
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std; struct Inf
{
int v,num;
}inf[22]; int need[22];
int n,c; bool cmp(struct Inf a,struct Inf b)
{
return a.v>b.v;
} int main()
{
while(~scanf("%d%d",&n,&c))
{
for(int i=1;i<=n;i++)
scanf("%d%d",&inf[i].v,&inf[i].num); sort(inf+1,inf+n+1,cmp);
int ans=0;
while(true)
{
memset(need,0,sizeof(need));
int sum=c;
for(int j=1;j<=n;j++)
{
int tmp=sum/inf[j].v;
tmp=min(tmp,inf[j].num);
need[j]+=tmp; //需要这么多个
sum-=tmp*inf[j].v; //还剩下的
}
if(sum>0) //不能恰好凑齐,用一个满足的最小的补
{
for(int j=n;j>=1;j--)
{
if(inf[j].num-need[j]&&inf[j].v>=sum)
{
need[j]++;
sum=0;
break;
}
}
}
if(sum>0) //再也凑不到了
break;
int Min=INF;
for(int j=1;j<=n;j++)//找到能够凑c的最多次数
if(need[j])
Min=min(Min,inf[j].num/need[j]);
ans+=Min;
for(int j=1;j<=n;j++) //减去个数
inf[j].num-=Min*need[j];
}
printf("%d\n",ans);
}
return 0;
}
最新文章
- Python版本2.7切3.5和3.5切2.7
- 学习Data Science/Deep Learning的一些材料
- 华为S5700S-52P-LI-AC千兆网管交换机web登录界面配置
- bzoj 1833 [ZJOI2010]count 数字计数(数位DP)
- cobbler部署
- 第一个deeplearning4jproject跑起
- ASP.NET Core WebApi 返回统一格式参数
- 机器学习之Adaboost (自适应增强)算法
- Linux之shell典型应用之脚本实现
- 【审核】检查iOS项目中是否使用了IDFA
- Android音视频之AudioTrack播放音频(二)
- Java线程状态Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释
- 美团技术沙龙01 - 58到家服务的订单调度&;数据分析技术
- 第三部分:Android 应用程序接口指南---第二节:UI---第十章 拖放
- Leetcode 144
- drf-视图的理解
- oracle表复制
- 2018.06.28 BZOJ1014 [JSOI2008]火星人prefix(非旋treap+hash)
- Extjs combox的异步加载
- 《Java程序设计》第四章-认识对象