Dollar Dayz (大数dp fuck!不是多组数据!!)

Dollar Dayz

Time Limit: 1000ms

Memory Limit: 65536KB

64-bit integer IO format: %lld      Java class name:
Main

Prev

Submit
Status Statistics Discuss

Next

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

Source

USACO 2006 January Silver

思路:一个老生长谈的整数划分问题

注意:是大数 long long 但是!!是一组一组的数据 不是多组!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

#include<bits/stdc++.h>
using namespace std;
const long long inf=1e15;
long long num[100];
long long dp[1010][110][10];

void add(int a,int b,int c,int d)  //每位存15位数
{
    long long mx=0;
    for(int i=0; i<3; i++)
    {
        long long z=dp[a][b][i]+dp[c][d][i]+mx;
        dp[a][b][i]=z%inf;
        mx=z/inf;
    }
}

void print(int a,int b)//
{
    int t=0;
    for(int i=0; i<3; i++)
    {
        num[i]=dp[a][b][i];
        //printf("%d %d %d %d\n",a,b,i,dp[a][b][i]);
        if(dp[a][b][i]!=0)
            t=i;
    }
    for(int i=t; i>=0; i--)
    {
        if(i!=t)
            printf("%015lld",num[i]);
        else
            printf("%lld",num[i]);
    }
    printf("\n");
}

int main()
{

    int n,k;
    while(~scanf("%d%d",&n,&k))
    {
        memset(dp,0,sizeof(dp));
        //printf("*****\n");
        for(int i=1; i<=n+1; i++)
        {
            dp[i][1][0]=1;
            int aaa=min(i,k);
            for(int j=2; j<=aaa; j++)
            {
                for(int k=1; k<=j; k++)
                {
                    if(i-k<k)
                        add(i,j,i-k,i-k);    //dp[i][j] = dp[i][j] + dp[i-k][i-k];
                    else
                        add(i,j,i-k,k);      // dp[i][j] = dp[i][j] + dp[i-k][k];
                }
            }

        }

        int t=0;
        for(int i=0; i<3; i++)
        {
            num[i]=dp[n+1][k][i];
            //printf("%d %d %d %d\n",a,b,i,dp[a][b][i]);
            if(dp[n+1][k][i]!=0)
                t=i;
        }
        for(int i=t; i>=0; i--)
        {
            if(i!=t)
                printf("%015lld",num[i]);//补零
            else
                printf("%lld",num[i]);
        }
        printf("\n");
    }
}
时间: 2024-10-05 05:58:17

Dollar Dayz (大数dp fuck!不是多组数据!!)的相关文章

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

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

uva10069 - Distinct Subsequences(大数+DP)

题目:uva10069 - Distinct Subsequences(大数+DP) 题目大意:给出字符串A , B.问能够在A中找到多少子串B,可以不连续. 解题思路:dp[i][j] 代表从i位开始的B串在从j位开始的A串中能够找到多少种. B[i] == A[j] dp[i][j] = dp[i - 1][j - 1] + dp[i][j - 1]: B[i] != A[j] dp[i][j] = dp[i][j - 1]:边界要处理一下.就是B中只有最后的那个字符来和A匹配的情况要处理一

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

POJ Dollar Dayz 美元假日(完全背包,常规+大数)

题意:给出整数n和k,n代表拥有的钱数量,k代表有k种工具,其价钱分别为1~k.求n元能有多少种购买的方案. 思路:k最大有100,数量过大,要用大数.其他的基本和完全背包一样. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 const int B=1005, N=150; 7 int

POJ3181——DP(找钱3)——Dollar Dayz

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

(完全背包 大数)Dollar Dayz (POJ 3181)

http://poj.org/problem?id=3181 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

DP:Dollar Dayz(POJ 3181)

一道高精度DP 题目大意,换工具,有m块钱,有k种价值的物品,(1...k),求一共有多少种换法 这一题就是完全背包,现在这种完全背包对我来说就是水题了, 状态转移方程闭着眼睛写dp[j]+=dp[j-i] 可是这一题还没完,数据量太大,会出现溢出的情况,这一题有一点高精度的要求,要求也挺简单的,两个long long就可以了 状态转移方程变为: dpl[j]+=dpl[j-i]; dph[j]+=dph[j-i]+f(j)  当dpl[j]>Up时,f(j)=1,且dpl[j]=dp[j]-U

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