【完全背包/母函数】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>
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;
}
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;
}
相关文章推荐
- KVC和KVO
- C++实现顺序存储的线性表
- AndroidDev站点推荐-zz
- IOS简单的定位
- SPOJ3267 D-query 离线+树状数组 在线主席树
- Ubuntu14.04 LTS更新源解决Ubuntu下载过慢问题
- 三线跑酷例子BlocksRun的技术点
- 三线跑酷例子BlocksRun的技术点
- 全局偏移表(GOT)和过程链接表(PLT)
- Linux rm命令
- Gson解析json数据
- BUG popupwindow的使用 token null is not valid; is your activity running?
- mysql 导出和导入
- ionic兼容title居中和tab栏放在底部
- 如何减小与“大牛”的差距
- Mapped Statements collection does not contain value for
- 查看本机IP地址及子网掩码(netmask)
- Android网络请求库——android-async-http
- 查看本机IP地址及子网掩码(netmask)
- C++ 归并排序算法实现