POJ--3181--Dollar Dayz--背包/高精度

Dollar Dayz

Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 4220   Accepted: 1642

Description

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

题意:输入n,k表示有k种硬币,价值是1~k,求用这些硬币组合出价值n的方案数

解析:数值很大,64位装不下,所以用两个64位的分别充当高位和低位来解决,然后就是完全背包问题了

*******这里有个点我要说,虽然不算错,但是这是题目的漏洞跟思维的严谨,就是当有高位需要输出时一定要把位补起来,一般都是以1E18为摸,所以一般都是有高位就输出高位,接着把低位输出,我说如果低位没有18位整的呢?

拿100来说,高位是1,低位是99,这好,输出来直接就是199,如果低位是9呢?输出的就是19,低位的前导零没有处理啊,有些代码的正确只是建立在数据的不严谨啊。。

#include <iostream>
#include <cstdio>
#include <cstring>
#define Max(a,b) a>b?a:b
using namespace std;
__int64 mod=1000000000000000000;
int main (void)
{
    int n,m,i,j,k,l;
    __int64 dp[2][1111];
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        memset(dp,0,sizeof(dp));
        dp[0][0]=1;
        if(m>n)m=n;
        for(i=1;i<=m;i++)
        for(j=i;j<=n;j++)
        {
            dp[1][j]=dp[1][j-i]+dp[1][j]+(dp[0][j-i]+dp[0][j])/mod;	//高位
            dp[0][j]=(dp[0][j-i]+dp[0][j])%mod;	//低位
        }
        if(dp[1][n])
        {
            printf("%I64d",dp[1][n]);
            printf("%018I64d\n",dp[0][n]);	//补充前导零
        }else
        {
            printf("%I64d\n",dp[0][n]);	//这个不用补充前导零
        }
    }
    return 0;
}
时间: 2024-10-13 17:36:49

POJ--3181--Dollar Dayz--背包/高精度的相关文章

POJ 3181 Dollar Dayz(完全背包+简单高精度加法)

POJ 3181 Dollar Dayz(完全背包+简单高精度加法) http://poj.org/problem?id=3181 题意: 给你K种硬币,每种硬币分别是1美元,2美元-K美元且可以无限使用,问你用上面K种硬币构成n美元的话有多少种方法? 分析: 本题是一道明显的完全背包问题, 不过本题还可以换一种方法来看: 整数n由前K个自然数构造, 一共有多少种方法? (虽然本题要用到高精度加法, 但是很简单, 不要被吓到哦) 首先是DP部分: 令dp[i][j]==x 表示由前i种硬币构成j

POJ 3181 Dollar Dayz &amp;&amp; Uva 147 Dollars(完全背包)

首先是 Uva 147:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=83 细心看完这题后发现还是完全背包,只不过需要对浮点数处理一下.即把所有硬币的面值都乘以100,化为整数,对输入的数据也作同样的处理,然后就是套完全背包的模板了,在输出时还要用格式和精度来卡一卡你……一开始我没想到用printf可以的,于是百度了cout的输出格式控制,

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

题意 : 给出目标金额 N ,问你用面额 1~K 拼成 N 的方案有多少种 分析 : 完全背包的裸题,完全背包在 DP 的过程中实际就是列举不同的装填方案数来获取最值的 故状态转移方程为 dp[i] += dp[j-w[i]] 但是这题怎么可能那么简单呢! N 和 K 的上限导致答案过大,需要使用高精度加法来完成 所以无耻的用 JAVA 来搞定了 import java.io.*; import java.lang.reflect.Array; import java.util.*; impor

POJ 3181 Dollar Dayz 【完全背包】

题意: 给出两个数,n,m,问m以内的整数有多少种组成n的方法完全背包+大数划分 思路: dp[i][j] := 用i种价格配出金额j的方案数. 那么dp[i][0] = 1,使用任何价格配出金额0的方案个数都是1(什么都不用). 递推关系式: 实际上是完全背包问题,只是状态转移方程形式有所不同,不过状态转移的方向是完全相同的. dp[i][j] = dp[i – 1][j] + dp[i – 1][j – i] + dp[i – 1][j – 2 * i] + - + dp[i – 1][0]

POJ 3181 Dollar Dayz

其实这道题就是简单的完全背包问题.从低到高推断出每种硬币的所有面额的解即可.当然,离线的话会慢一点.可以将问题需要求出的子问题全部求出来.下一个问题出现的时候,如果之前已经求解过则不必求解,否则在之前的基础上继续求解.原本觉得没什么好写的,关键是同样的方法用STL中的vector代替数组会超时!搞得以后都不敢用STL了..... #include <iostream> #include <cstdio> #include <algorithm> #include <

poj 3181 Dollar Dayz DP

题意:给你一个n,还有k,求问有多少种数字组合,能够使得数字之和为n,这些数字的范围是1到k. 如,给你n=4, k=2.那么 1+1+1+1=4, 1+1+2=4,2+2=4,四种组合. 思路:完全背包,可以设d[i][j]代表从i个数字相加和为j的组合数. 那么,可以考虑把这些组合数分为,有数字i和没有数字i,那么没有数字i的组合数就为d[i-1][j],有数字i的组合数就为d[i][j-i](可以在这些组合里面加上1个i). 所以,转移方程可以写成d[i][j] = d[i-1][j] +

POJ 3181 Dollar Dayz 01全然背包问题

01全然背包问题. 主要是求有多少种组合.二维dp做的人多了,这里使用一维dp就能够了. 一维的转换方程:dp[j] = dp[j-i] + dp[j];当中i代表重量,j代表当前背包容量. 意思就是dp[j-i] 代表j-i背包重量的时候最多的组合数,那么假设到了背包容量为j的时候,就是能够把第i个物品装进背包,那么就有dp[j-i]种装法, 假设没有i物品之前.那么容量为j的时候组合数是dp[j]. 那么当有i物品,且容量为j的时候,那么组合数就是dp[j-i] + dp[j]; 二维能够转

POJ 3181 Dollar Dayz 01完全背包问题

01完全背包问题. 主要是求有多少种组合.二维dp做的人多了,这里使用一维dp就可以了. 一维的转换方程:dp[j] = dp[j-i] + dp[j];其中i代表重量,j代表当前背包容量. 意思就是dp[j-i] 代表j-i背包重量的时候最多的组合数,那么如果到了背包容量为j的时候,就是可以把第i个物品装进背包,那么就有dp[j-i]种装法, 如果没有i物品之前,那么容量为j的时候组合数是dp[j]: 那么当有i物品,且容量为j的时候,那么组合数就是dp[j-i] + dp[j]; 二维可以转

POJ3181 Dollar Dayz 【母函数】+【高精度】

Dollar Dayz Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 4204   Accepted: 1635 Description 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 sell

poj3181 Dollar Dayz (DP+大数)

Dollar Dayz Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:65536KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 3181 Appoint description: System Crawler (2016-05-27) Description Farmer John goes to Dollar Da