您的位置:首页 > 其它

【完全背包/母函数】HDU1284钱币兑换问题

2016-04-07 14:24 316 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1284

Problem Description

在一个国家仅有1分,2分,3分硬币,将钱N兑换成硬币有很多种兑法。请你编程序计算出共有多少种兑法。

 

Input

每行只有一个正整数N,N小于32768。

 

Output

对应每个输入,输出兑换方法数。

 

Sample Input

2934
12553

 

Sample Output

718831
13137761

完全背包代码:

#include<iostream>
#include<cstring>
using namespace std;
int n;
int f[35000];
void CompletePack()
{
memset(f,0,sizeof(f));
f[0]=1;
for(int i=1;i<=3;i++)
for(int j=i;j<=35000;j++)
f[j]+=f[j-i];       //  兑换的方案数;
}
int main()
{
CompletePack();
while(cin>>n){
cout<<f
<<endl;
}
return 0;
}
/*     常规解法;
需要满足的条件 k1 + 2 * k2 + 3 * k3 = n
原理:先确定硬币3的个数k3,每一个k3都能确定剩下的硬币换取方案,
且不重复k3确定之后k1, k2只需要满足 k1 + 2 * k2 = n - 3 * k3
而满足这样的任意一个k2对应了一个k1,k2的范围为 0...(n-3 * k3) / 2,一共有(n-3 * k3) / 2 + 1 个
#include<iostream>
using namespace std;
int main()
{
int n;
while(cin>>n){
int sum=0;
sum+=n/3+1;
for(int i=0;i<=n/3;i++)
sum+=(n-i*3)/2;
cout<<sum<<endl;
}
return 0;
}*/

母函数代码:

#include<iostream>
using namespace std;
const int maxn=32768;
int f[maxn]={0};
int tmp[maxn]={0};
void faction()
{
for(int i=0;i<maxn;i++)
f[i]=1;
for(int i=2;i<=3;i++){ // 第二个表达式开始(共三个表达式)
for(int j=0;j<maxn;j++) // 第一个表达式的每个项因子
for(int k=0;k+j<maxn;k+=i)
tmp[k+j]+=f[j]; // 用临时数组保存指数是k+j的系数
for(int j=0;j<maxn;j++){
f[j]=tmp[j];
tmp[j]=0;
}
}
}
int main()
{
int n;
cin.sync_with_stdio(false);
faction();
while(cin>>n){
cout<<f
<<endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: