poj3040 Allowance 題解報告

2022-04-28 20:27:10 字數 1456 閱讀 1094

題目傳送門

【題目大意】

有$n$種面值的硬幣,第$i$種有$b_i$個,大的硬幣是小的硬幣的倍數,給定乙個金額$k$,求最多可以組成多少份金額不小於$k$的組合。

【思路分析】

首先去掉能自成一組的硬幣,然後考慮幾種硬幣湊成一組,貪心策略就是優先考慮面值大的,細節見**。

【**實現】

1 #include2 #include3 #include4 #include5 #include6

#define g() getchar()

7#define rg register

8#define go(i,a,b) for(rg int i=a;i<=b;i++)

9#define back(i,a,b) for(rg int i=a;i>=b;i--)

10#define db double

11#define ll long long

12#define il inline

13#define pf printf

14#define mem(a,b) memset(a,b,sizeof(a))

15using

namespace

std;

16ll fr()

23while(ch>='

0'&&ch<='

9') w=(w<<1)+(w<<3)+ch-'

0',ch=g();

24return w*q;25}

26const

int n=22;27

ll n,c,ans,use[n];

28struct

moneycoin[n];

31bool

tag;

32bool

cmp(money a,money b)

35int

main()

46while(1

)//如果組成一組了就退出57}

58}59if(t>0)64}

65}66if(tag) break;67

}68}69

if(!tag) break;//

無法湊成一組的情況

70 rg ll as=1e9+7

;71 go(i,1,n) if(use[i]) as=min(as,coin[i].b/use[i]);

72//

考慮到有幾種硬幣湊成一組的情況所以要取最小值

73 ans+=as

;74 go(i,1,n) coin[i].b-=use[i]*as;75

}76 pf("

%lld\n

",ans);

77return0;

78 }

**戳這裡

poj3040 貪心好題

題目大意 農場主給乙個小弟發工資,每週至少需要發c元,現在fj有一堆硬幣,這些硬幣面值的最大公約數相同即它們成倍數關係。問fj最多能給多少個星期的工資?這道題開始兩次都想錯了,後來看了別人的思路,感覺和裝箱問題有點類似。1 先排除掉大於等於c的面值,這些面值可以單獨發乙個星期 2 從剩下的面值中從大...

POJ3040給奶牛發工資

題意 有n種硬幣,每種硬幣有mi個,然後讓你給奶牛發工資,每週發至少c元 就是不找零錢的意思 然後問你能發幾周?硬幣之間都是倍數關係 思路 這個題目做了兩天,丟臉,看完這個題目我的第一反應就是從大的發起,就是先花面值大的,能大的就一直大的,只要不超過c,然後再能小的就一直小的,補全沒超過但是又不夠那...

POJ 刷題順序

poj從簡到難 按照ac數目排序 的列表如下,作為小弱的刷題順序。大牛們可以看後面倒排的hard表,還有四道題沒人拿到first blood.屬性依次為 id,title,ratio,ac,submit hard模式 4027 flights 0.0 0 39 4029 huzita axiom 6...