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(全然背包+简单高精度加法)的更多相关文章

  1. POJ 3181 Dollar Dayz ( 完全背包 && 大数高精度 )

    题意 : 给出目标金额 N ,问你用面额 1~K 拼成 N 的方案有多少种 分析 : 完全背包的裸题,完全背包在 DP 的过程中实际就是列举不同的装填方案数来获取最值的 故状态转移方程为 dp[i] ...

  2. POJ 3181 Dollar Dayz && Uva 147 Dollars(完全背包)

    首先是 Uva 147:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_p ...

  3. poj 3181 Dollar Dayz(完全背包)

    Dollar Dayz Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5419   Accepted: 2054 Descr ...

  4. POJ 3181 Dollar Dayz(高精度 动态规划)

    题目链接:http://poj.org/problem?id=3181 题目大意:用1,2...K元的硬币,凑成N元的方案数. Sample Input 5 3 Sample Output 5 分析: ...

  5. POJ 3181 Dollar Dayz 01全然背包问题

    01全然背包问题. 主要是求有多少种组合.二维dp做的人多了,这里使用一维dp就能够了. 一维的转换方程:dp[j] = dp[j-i] + dp[j];当中i代表重量,j代表当前背包容量. 意思就是 ...

  6. POJ 3181 Dollar Dayz (完全背包,大数据运算)

    题意:给出两个数,n,m,问1~m中的数组成n,有多少种方法? 这题其实就相当于 UVA 674 Coin Change,求解一样 只不过数据很大,需要用到高精度运算... 后来还看了网上别人的解法, ...

  7. POJ 3181 Dollar Dayz 简单DP

    这DP虽然简单 但是思考一下还是挺好的 题意是 1,2,3,4....k 用加法凑成N 每个数可取不限个数 令dp[i][j] 表示前i种数凑成j的方案数 然后dp[i][j] = dp[i - 1] ...

  8. poj 3181 Dollar Dayz(求组成方案的背包+大数)

    可能nyist看见加的背包专题我老去凑热闹,觉得太便宜我了.他们新加的搜索专题居然有密码. 都是兄弟院校嘛!何必那么小气. 回到正题,跟我写的上一篇关于求组成方案的背包思路基本一样,无非就是一个二维费 ...

  9. POJ 3181 Dollar Dayz 【完全背包】

    题意: 给出两个数,n,m,问m以内的整数有多少种组成n的方法完全背包+大数划分 思路: dp[i][j] := 用i种价格配出金额j的方案数. 那么dp[i][0] = 1,使用任何价格配出金额0的 ...

随机推荐

  1. POJ2796 Feel Good -- 单调队列

    Feel Good Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 14489   Accepted: 4015 Case T ...

  2. 【bzoj4896】[Thu Summer Camp2016]补退选 Trie树+STL-vector

    题目描述 X是T大的一名老师,每年他都要教授许多学生基础的C++知识.在T大,每个学生在每学期的开学前都需要选课,每次选课一共分为三个阶段:预选,正选,补退选:其中"补退选"阶段最 ...

  3. 【Luogu】P4067储能表(数位DP)

    题目链接 好的 看到这题之后我一直在想反演,然后想不出来,一度以为自己脑子有问题 然后我脑子真的有问题,这题tm根本就不是反演 设f[i][j][k][l]表示现在已经DP到从高位往低数的第i位,有没 ...

  4. bzoj3694最短路

    bzoj3694最短路 Description 给出一个n个点m条边的无向图,n个点的编号从1~n,定义源点为1.定义最短路树如下:从源点1经过边集T到任意一点i有且仅有一条路径,且这条路径是整个图1 ...

  5. 移动端px转rem的两种方法

    rem使用方法: rem ,root element,即相对于根元素的大小,浏览器默认字符大小为16px,此时1rem相当于16px.  方法1 设置font-size: body{font-size ...

  6. jquery 实践操作:iframe 相关操作

    此篇记录关于HTML 的 iframe 元素 的相关记录 定义:iframe 元素会创建包含另外一个文档的内联框架(即行内框架). 常用的基本 iframe 设置(详细设置属性参考API:http:/ ...

  7. nodeJS学习(5) --- sublime Text3 安装使用

    本节对对工具 sublime Text3 的安装进行简介. 主要参考网址:http://blog.csdn.net/sam976/article/details/52076271   http://w ...

  8. L#中 int.TryParse 有问题

    今天发现了一个 L# 的异常..因此记录一下 List<string> strList = new List<string>(); ; i<; ++i) { ; j< ...

  9. 51Nod 1028 大数乘法 V2

    http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1028 分析: FFT/NTT板子题... 代码: NTT板子: #inc ...

  10. 【CF1043D】Mysterious Crime(贡献)

    题意:给定m个人,每个人有n个数字且每个人的所有数字都是一个n的排列,求有多少种方案去掉某个前缀和后缀后m个人剩余的部分相等 m<=10,n<=1e5 思路:考虑极长的一段连续匹配的串,因 ...