POJ 3181 Dollar Dayz (完全背包 + 大数分离输出)
2018-01-30 21:30
246 查看
Farmer John goes to Dollar Days at The Cow Store and discovers an unlimited number of tools on sale. During his first visit, the tools are selling variously for $1, $2, and $3. Farmer John has exactly $5 to spend. He can buy 5 tools at $1 each or 1 tool at
$3 and an additional 1 tool at $2. Of course, there are other combinations for a total of 5 different ways FJ can spend all his money on tools. Here they are:
1 @ US$3 + 1 @ US$2
1 @ US$3 + 2 @ US$1
1 @ US$2 + 3 @ US$1
2 @ US$2 + 1 @ US$1
5 @ US$1
Write a program than will compute the number of ways FJ can spend N dollars (1 <= N <= 1000) at The Cow Store for tools on sale with a cost of $1..$K (1 <= K <= 100).
Input
A single line with two space-separated integers: N and K.
Output
A single line with a single integer that is the number of unique ways FJ can spend his money.
Sample Input
5 3
Sample Output
5
题意:可以有多少种方法使从1--k的数字中挑选任意的数字任意个构成n
思路:完全背包,但是此题目的数据太大,用long long也无法直接输出,那么我们采用大数分离的方法存储并输出
思路来源:http://www.hankcs.com/program/cpp/poj-3181-dollar-dayz.html
大数分离的方法:
1.用long long类型 存储数据比 int存储的位数更多 long long 类型为1.8e19 所以我们一个数组只存18位,留一位做进位处理,防止溢出
2.高位的计算+对低位进位
低位的计算
$3 and an additional 1 tool at $2. Of course, there are other combinations for a total of 5 different ways FJ can spend all his money on tools. Here they are:
1 @ US$3 + 1 @ US$2
1 @ US$3 + 2 @ US$1
1 @ US$2 + 3 @ US$1
2 @ US$2 + 1 @ US$1
5 @ US$1
Write a program than will compute the number of ways FJ can spend N dollars (1 <= N <= 1000) at The Cow Store for tools on sale with a cost of $1..$K (1 <= K <= 100).
Input
A single line with two space-separated integers: N and K.
Output
A single line with a single integer that is the number of unique ways FJ can spend his money.
Sample Input
5 3
Sample Output
5
题意:可以有多少种方法使从1--k的数字中挑选任意的数字任意个构成n
思路:完全背包,但是此题目的数据太大,用long long也无法直接输出,那么我们采用大数分离的方法存储并输出
思路来源:http://www.hankcs.com/program/cpp/poj-3181-dollar-dayz.html
大数分离的方法:
1.用long long类型 存储数据比 int存储的位数更多 long long 类型为1.8e19 所以我们一个数组只存18位,留一位做进位处理,防止溢出
2.高位的计算+对低位进位
低位的计算
#include <iostream> #include <cstdio> #include <map> #include <cstring> #include <string> #include <algorithm> #include <cmath> #include <set> using namespace std; typedef long long ll;//ll Ϊ 1.8e19 const ll INF = 1e18; const int N = 1e3+10; ll dp1 ; ll dp2 ; int main() { int n,k; scanf("%d%d",&n,&k); memset(dp1,0,sizeof(dp1)); memset(dp2,0,sizeof(dp2)); dp2[0]=1; for(int i=1;i<=k;i++) for(int j=i;j<=n;j++){ dp1[j]=(dp1[j]+dp1[j-i])+(dp2[j]+dp2[j-i])/INF; //高位 从后往前 19--36位 dp2[j]=(dp2[j]+dp2[j-i])%INF; //低位 从后往前1--18位 } if(dp1 ) printf("%lld",dp1 ); printf("%lld\n",dp2 ); return 0; }
相关文章推荐
- POJ 3181 Dollar Dayz (完全背包 + 大数分离输出)
- POJ 3181 Dollar Dayz (完全背包 + 大数分离输出)
- POJ 3181 Dollar Dayz (完全背包 + 大数分离输出)
- POJ 3181 Dollar Dayz (完全背包 + 大数分离输出)
- POJ 3181 Dollar Dayz (完全背包 + 大数分离输出)
- POJ 3181 Dollar Dayz (完全背包 + 大数分离输出)
- POJ 3181 Dollar Dayz (完全背包 + 大数分离输出)
- POJ1787 【完全背包+物品计数+路径输出】
- POJ-1787 Charlie's Change (完全背包+输出方案 入门题)
- (经典)POJ-3181 完全背包+大数处理
- POJ Dollar Dayz 美元假日(完全背包,常规+大数)
- poj 3181 Dollar Dayz 钱币兑换问题 大数/高精度 完全背包
- POJ 2063 Investment(完全背包)
- Dollar Days POJ 3181 完全背包+高精度
- POJ 2063 Investment DP(完全背包)
- POJ 3260 The Fewest Coins(多重背包+完全背包)
- poj 2229 Sumsets 完全背包求方案总数
- poj 2063 Investment ( zoj 2224 Investment ) 完全背包
- poj 1252 Euro Efficiency 正负完全背包
- POJ 2063【完全背包】