日期:2014-05-16 浏览次数:20405 次
JSU省赛队员选拔赛个人赛1
一、题目概述:
A、Coin Change(暴力求解、动态规划)
B、Fibbonacci Number(递推求解)
C、Max Num(排序、比较)
D、单词数(字符串比较、库函数运用)
E、无限的路(平面几何)
F、叠筐(规律输出)
二、解题报告:
A、Coin Change
给一个钱的总金额,求出用100个以内的50分、25分、10分、5分、1分硬币拼成该金额的不同拼法。
直接暴力,打表什么的都是浮云。开始总觉得用暴力求解显得自己没风度,不够高端霸气上档次。当面临各种WA时,什么都是浮云,唯有AC才是王道。
用i,j,k,x,y分别表示50分、25分、10分、5分、1分硬币的数量,用四重循环直接暴力(不用五层。剩下的变量直接可以求得)。当y=n-x*5-k*10-j*25-i*50;并且y不小于0,硬币总数不大于100的时候,表示这种拼法是可以的,计数变量sum自加一,最后直接输出计数变量即可。
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int main()
{
int n;
int i,j,k,x,y;
while(cin>>n)
{
__int64 sum=0;
for(i=0; i<=n/50; i++) //50分的硬币i个
for(j=0; j<=n/25; j++) //25分的硬币j个
for(k=0; k<=n/10; k++) //10分的硬币k个
for(x=0; x<=n/5; x++) //5分的硬币x个
{
y=n-x*5-k*10-j*25-i*50; //一分的硬币y个
if(y>=0&&i+j+k+x+y<=100)sum++; //满足要求,这种拼法是可以的
}
cout<<sum<<endl;
}
return 0;
}
没什么好讲的,直接用公式来算就好了。
不过要注