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的 ...
随机推荐
- 【bzoj2245】[SDOI2011]工作安排 费用流
题目描述 你的公司接到了一批订单.订单要求你的公司提供n类产品,产品被编号为1~n,其中第i类产品共需要Ci件.公司共有m名员工,员工被编号为1~m员工能够制造的产品种类有所区别.一件产品必须完整地由 ...
- 多线程(实现Runnable接口)
/** * 创建一个子线程, 完成1-100之间自然数的输出,同样的主线程执行同样的操作 *创建多线程的第二种方式,通过实现的方式 * 继承和实现的方式对比 * 一,联系: * public cla ...
- [ZJOI2011][bzoj2229] 最小割 [最小割树]
题面 传送门 思路 首先我们明确一点:这道题不是让你把$n^2$个最小割跑一遍[废话] 但是最小割过程是必要的,因为最小割并没有别的效率更高的算法(Stoer-Wagner之类的?) 那我们就要尽量找 ...
- U盘用FAT32还是用NTFS格式好
U盘用FAT32还是用NTFS格式好 ● FAT32文件系统 FAT32使用4个字节(也就是32位)的空间来表示每个扇区(Sector)配置文件的情形,故称之为FAT32.FAT16的分区容量上限是2 ...
- Repeater嵌套(灵活的)
页面代码 <form id="form1" runat="server"> <asp:Repeater ID="rptCategor ...
- Python 读取 pkl文件
使用python 的cPickle 库中的load函数,可以读取pkl文件的内容 import cPickle as pickle fr = open('mnist.pkl') #open的参数是pk ...
- 数位DP毕业题
原题 题意 给一个 $64$ 位的二进制数,求小于这个数的回文二进制数的数量. 题解 加强版 题意 同上,但允许一个数最多有 $k$ 位不是回文(即把任意 $k$ 位取反后这个数是一个回文数),这种数 ...
- ios 上传视频或图片
关于iOS如何实现视频和图片的上传, 我们先理清下思路 思路: #1. 如何获取图片? #2. 如何获取视频? #3. 如何把图片存到缓存路径中? #4. 如何把视频存到缓存路径中? #5. 如何上传 ...
- Safari 11.0 已发布,新特性都在这儿了!
Safari 11.0 兼容性 Safari 11.0 可运行于 iOS 11.0 和 macOS 10.1版本的系统环境,同时在macOS 10.12.6 和 10.11.6版本中也可以使用. Hi ...
- JavaScript内部是这样运行
编译阶段 词法分析(Lexing) 这个过程会将由字符组成的字符串分解成(对编程语言来说)有意义的代码块,这些代 码块被称为词法单元(token). 简单举个例子:c = b - a 转换为 NAME ...