POJ 3181 Dollar Dayz(全然背包+简单高精度加法)
POJ 3181 Dollar Dayz(全然背包+简单高精度加法)
id=3181">http://poj.org/problem?id=3181
题意:
给你K种硬币,每种硬币各自是1美元,2美元…K美元且能够无限使用,问你用上面K种硬币构成n美元的话有多少种方法?
分析:
本题是一道明显的全然背包问题, 只是本题还能够换一种方法来看: 整数n由前K个自然数构造, 一共同拥有多少种方法?
(尽管本题要用到高精度加法,
可是非常easy, 不要被吓到哦)
首先是DP部分:
令dp[i][j]==x 表示由前i种硬币构成j美元一共同拥有x种方法.
初始化dp全0 且 dp[0][0]=1
状态转移: dp[i][j] = sum( dp[i-1][j] , dp[i][j-val[i]] ) //sum为求和,val[i]是第i种硬币的面值.
前者表示第i种硬币一个都不选, 后者表示至少选一个第i种硬币来用.
终于所求: dp[k][n]的值. 程序实现用的滚动数组, 所以dp仅仅有[j]一维.
其次是高精度部分:
假设输入1000 100时,输出将为:
15658181104580771094597751280645这个值超过了long long的范围. 所以这里我们须要用大整数来表示dp[i][j]的值. 我的大整数实现是用high和low 的组合来表示一个大整数的. 当中low表示大整数的十进制表示时的低18位数. high表示大整数的十进制表示时的高18位数.
整体来说实现比較简单.
AC代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const long long BASE = 1e18;
const int maxn=1000+5; int n,k; //大整数类
class BigNum
{
public:
BigNum(){}
BigNum(long long high,long long low):high(high),low(low){}
long long high; //高18位
long long low; //低18位 //相加运算
BigNum operator+(BigNum &B)
{
long long high_tmp = (low+B.low)/BASE+high+B.high;
long long low_tmp = (low+B.low)%BASE;
return BigNum(high_tmp, low_tmp);
} //输出值
void print()
{
if(!high)//高位为0
printf("%I64d\n",low);
else //高位非0
{
printf("%I64d",high);
printf("%018I64d",low);
}
}
}dp[maxn]; int main()
{
while(scanf("%d%d",&n,&k)==2)
{
//初始化
memset(dp,0,sizeof(dp));
dp[0].low=1;//等效于令dp[0]=0; //递推
for(int i=1;i<=k;i++)
{
for(int j=i;j<=n;j++)
dp[j] = dp[j]+dp[j-i];
} //输出
dp[n].print();
} return 0;
}
POJ 3181 Dollar Dayz(全然背包+简单高精度加法)的更多相关文章
- POJ 3181 Dollar Dayz ( 完全背包 && 大数高精度 )
题意 : 给出目标金额 N ,问你用面额 1~K 拼成 N 的方案有多少种 分析 : 完全背包的裸题,完全背包在 DP 的过程中实际就是列举不同的装填方案数来获取最值的 故状态转移方程为 dp[i] ...
- POJ 3181 Dollar Dayz && Uva 147 Dollars(完全背包)
首先是 Uva 147:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_p ...
- poj 3181 Dollar Dayz(完全背包)
Dollar Dayz Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5419 Accepted: 2054 Descr ...
- POJ 3181 Dollar Dayz(高精度 动态规划)
题目链接:http://poj.org/problem?id=3181 题目大意:用1,2...K元的硬币,凑成N元的方案数. Sample Input 5 3 Sample Output 5 分析: ...
- POJ 3181 Dollar Dayz 01全然背包问题
01全然背包问题. 主要是求有多少种组合.二维dp做的人多了,这里使用一维dp就能够了. 一维的转换方程:dp[j] = dp[j-i] + dp[j];当中i代表重量,j代表当前背包容量. 意思就是 ...
- POJ 3181 Dollar Dayz (完全背包,大数据运算)
题意:给出两个数,n,m,问1~m中的数组成n,有多少种方法? 这题其实就相当于 UVA 674 Coin Change,求解一样 只不过数据很大,需要用到高精度运算... 后来还看了网上别人的解法, ...
- POJ 3181 Dollar Dayz 简单DP
这DP虽然简单 但是思考一下还是挺好的 题意是 1,2,3,4....k 用加法凑成N 每个数可取不限个数 令dp[i][j] 表示前i种数凑成j的方案数 然后dp[i][j] = dp[i - 1] ...
- poj 3181 Dollar Dayz(求组成方案的背包+大数)
可能nyist看见加的背包专题我老去凑热闹,觉得太便宜我了.他们新加的搜索专题居然有密码. 都是兄弟院校嘛!何必那么小气. 回到正题,跟我写的上一篇关于求组成方案的背包思路基本一样,无非就是一个二维费 ...
- POJ 3181 Dollar Dayz 【完全背包】
题意: 给出两个数,n,m,问m以内的整数有多少种组成n的方法完全背包+大数划分 思路: dp[i][j] := 用i种价格配出金额j的方案数. 那么dp[i][0] = 1,使用任何价格配出金额0的 ...
随机推荐
- 删除 node 【笔记】
sudo npm uninstall npm -g sudo rm -rf /usr/local/lib/node /usr/local/lib/node_modules /var/db/receip ...
- location.replace()和location.href=进行跳转的区别
location.href 通常被用来跳转到指定页面地址;location.replace 方法则可以实现用新的文档替换当前文档;location.replace 方法不会在 history 对象中生 ...
- golang 高级
下面的EmployeeByID函数将根据给定的员工ID返回对应的员工信息结构体的指针.我们可以使用点操作符来访问它里面的成员: func EmployeeByID(id int) *Employee ...
- hdu6136[模拟+优先队列] 2017多校8
有点麻烦.. /*hdu6136[模拟+优先队列] 2017多校8*/ #include <bits/stdc++.h> using namespace std; typedef long ...
- js 判断对象类型
在企业级的开发中,我们常用 typeof 来判断企业 对象类型:但是 typeof 不能判断 Array 和 null 这里我们使用一个 原型上的 toString方法:请看一下代码: <scr ...
- session失效时间
1.web容器中设置(此处以tomcat为例) <session-config> <session-timeout>30</session-timeout> < ...
- ALICTF2014 EvilAPK4脱壳分析
相关文件可以在下面链接中下载: http://pan.baidu.com/s/1sjpvFy9 1 简述 该apk使用libmobisec.so函数实现对dex的解密还原.真正的dex为assets目 ...
- hdu Rich Game 6245
Rich Game Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total S ...
- 【SPOJ61】Brackets(线段树)
题意:给出一个括号序列,要求维护两种操作: 1.将第x位上的括号取反 2.查询当前整个括号序列是否匹配 n<=3e4 思路:线段树维护区间内没有匹配的左右括号数量 pushup时t[p].r=t ...
- js, lambada? 在chrome和node下可以使用
var a=function(a,c){if(a)c(a)} undefined a(true,(console.log)) VM177:2 Uncaught TypeError: Illegal i ...