POJ 3181 -- Dollar Dayz


3181 -- Dollar Dayz
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.
http://blog.csdn.net/u014688145/article/details/71136194
农夫约翰有N元钱,市场上有价值1……K的商品无限个,求所有的花钱方案?
dp[i][j] :用i种价格配出金额j的方案数 初始化: dp[i][0] = 1; 用i中价格配出金额0的方案数为1 递推式: dp[i][j] = dp[i-1][j] + dp[i-1][j-i] + dp[i-1][j-2*i] + ... + dp[i-1][0] 如: 1 * x + 2 * y = 5; y = 0, 1 * x = 5 y = 1, 1 * x = 3 y = 2, 1 * x = 1 dp[2][5] = dp[1][5] + dp[1][3] + dp[1][1]

public static void main(String[] args) { Scanner in = new Scanner(System.in); int N = in.nextInt(); int K = in.nextInt(); System.out.println(solve(N, K)); in.close(); } public static BigInteger solve(int N, int K){ BigInteger[][] dp = new BigInteger[K + 1][N + 1]; for (int i = 0; i < dp.length; i++){ for (int j = 0; j < dp[0].length; j++){ dp[i][j] = BigInteger.ZERO; } } dp[0][0] = BigInteger.ONE; for (int i = 1; i <= K; ++i) { for (int k = 0; k <= N; k += i) { for (int j = N; j >= k; --j) { dp[i][j] = dp[i][j].add(dp[i - 1][j - k]); } } } return dp[K][N]; }
递推式优化:
dp[i][j] = dp[i-1][j] + dp[i-1][j-i] + dp[i-1][j-2*i] + ... + dp[i-1][0]; dp[i][j-i] = dp[i-1][j-i] + dp[i-1][j-2*i] + dp[i-1][j-3*i] + ... + dp[i-1][0]; 所以有: dp[i][j] = dp[i-1][j] + dp[i][j-i];
public static BigInteger solve(int N, int K){ BigInteger[][] dp = new BigInteger[K + 1][N + 1]; for (int i = 0; i < dp.length; i++){ for (int j = 0; j < dp[0].length; j++){ dp[i][j] = BigInteger.ZERO; } } dp[0][0] = BigInteger.ONE; for (int i = 1; i <= K; ++i) { //必须得初始化,dp[i][0]不能由dp[0][0]推得 dp[i][0] = BigInteger.ONE; for (int j = 1; j <= N; ++j){ if (j < i){ dp[i][j] = dp[i-1][j]; } else{ dp[i][j] = dp[i-1][j].add(dp[i][j-i]); } } } return dp[K][N]; }
https://shanzi.gitbooks.io/algorithm-notes/content/problem_solutions/dollar_daz.html
完全背包+简单高精度加法
http://www.cnblogs.com/kuangbin/archive/2012/09/20/2695165.html
看上面这个式子a[i][j]=a[i][j-1]+a[i-j][j-1]+a[i-2j][j-1]+a[i-3j][j-1]…+a[0][j-1]我们可以发现,其实可以转到a[i][j]的状态有两种,一种是a[i][j-1]就是不用j这个数字拼接i这个数字的方法数,另一种是a[i-j][j]就是用了j这个数字拼接的到i-j的方法数那么状态转移方程就可以写成a[i][j]=a[i][j-1]+a[i-j][j]不用加那么多项,就降低了一个数量级的复杂度

http://www.hankcs.com/program/cpp/poj-3181-dollar-dayz.html
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]
    cin >> N >> K;
    dp[0][0] = 1;
    for (int i = 1; i <= K; ++i)
    {
        for (int k = 0; k <= N; k += i)
        {
            for (int j = N; j >= k; --j)
            {
                dp[i][j] += dp[i - 1][j - k];
            }
        }
    }
    cout << dp[K][N] << endl;


    for (int i = 1; i <= K; ++i)
    {
        dp[i][0][1] = 1;
        for (int j = 1; j <= N; ++j)
        {
            if (j < i)
            {
                dp[i][j][0] = dp[i - 1][j][0];
                dp[i][j][1] = dp[i - 1][j][1];
            }
            else
            {
                dp[i][j][0] = dp[i - 1][j][0] + dp[i][j - i][0];
                dp[i][j][1] = dp[i - 1][j][1] + dp[i][j - i][1];
                // 高位进位
                dp[i][j][0] += dp[i][j][1] / LIMIT_ULL;
                // 低位限制
                dp[i][j][1] = dp[i][j][1] % LIMIT_ULL;
            }
        }
    }
    if (dp[K][N][0])
    {
        cout << dp[K][N][0];
    }
    cout << dp[K][N][1] << endl;
http://d.hatena.ne.jp/komiyam/20121026/1351261358
 void run(){
  Scanner in = new Scanner(System.in);
  int N = in.nextInt(), K = in.nextInt();
  BigInteger[] ways = new BigInteger[N + 1];
  for (int i = 0; i < ways.length; i++) {
   ways[i] = BigInteger.ZERO;
  }
  ways[0] = BigInteger.ONE;
  for (int p = 1; p <= K; ++p) {
   for (int money = p; money < ways.length; money++) {
    ways[money] = ways[money].add(ways[money - p]);
   }
  }
  System.out.println(ways[N]);
 }
http://blog.csdn.net/kenden23/article/details/41695331
  1. void getCombinations(int N, int K)  
  2. {  
  3.     memset(hiBit, 0, sizeof(long long) * (N+1));  
  4.     memset(lowBit, 0, sizeof(long long) * (N+1));  
  5.     lowBit[0] = 1LL;  
  6.     for (int i = 1; i <= K; i++)  
  7.     {  
  8.         for (int j = i; j <= N; j++)  
  9.         {  
  10.             lowBit[j] += lowBit[j-i];//买和不买i物品的和,就是当前组合和了  
  11.             hiBit[j] += lowBit[j] / MOD + hiBit[j-i];//错误:忘记hiBit[j-i]  
  12.             lowBit[j] %= MOD;//保存低位  
  13.         }  
  14.     }  
  15. }  
http://www.bubuko.com/infodetail-430742.html
//大整数类
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;
}
Read full article from 3181 -- Dollar Dayz

Labels

LeetCode (1432) GeeksforGeeks (1122) LeetCode - Review (1067) Review (882) Algorithm (668) to-do (609) Classic Algorithm (270) Google Interview (237) Classic Interview (222) Dynamic Programming (220) DP (186) Bit Algorithms (145) POJ (141) Math (137) Tree (132) LeetCode - Phone (129) EPI (122) Cracking Coding Interview (119) DFS (115) Difficult Algorithm (115) Lintcode (115) Different Solutions (110) Smart Algorithm (104) Binary Search (96) BFS (91) HackerRank (90) Binary Tree (86) Hard (79) Two Pointers (78) Stack (76) Company-Facebook (75) BST (72) Graph Algorithm (72) Time Complexity (69) Greedy Algorithm (68) Interval (63) Company - Google (62) Geometry Algorithm (61) Interview Corner (61) LeetCode - Extended (61) Union-Find (60) Trie (58) Advanced Data Structure (56) List (56) Priority Queue (53) Codility (52) ComProGuide (50) LeetCode Hard (50) Matrix (50) Bisection (48) Segment Tree (48) Sliding Window (48) USACO (46) Space Optimization (45) Company-Airbnb (41) Greedy (41) Mathematical Algorithm (41) Tree - Post-Order (41) ACM-ICPC (40) Algorithm Interview (40) Data Structure Design (40) Graph (40) Backtracking (39) Data Structure (39) Jobdu (39) Random (39) Codeforces (38) Knapsack (38) LeetCode - DP (38) Recursive Algorithm (38) String Algorithm (38) TopCoder (38) Sort (37) Introduction to Algorithms (36) Pre-Sort (36) Beauty of Programming (35) Must Known (34) Binary Search Tree (33) Follow Up (33) prismoskills (33) Palindrome (32) Permutation (31) Array (30) Google Code Jam (30) HDU (30) Array O(N) (29) Logic Thinking (29) Monotonic Stack (29) Puzzles (29) Code - Detail (27) Company-Zenefits (27) Microsoft 100 - July (27) Queue (27) Binary Indexed Trees (26) TreeMap (26) to-do-must (26) 1point3acres (25) GeeksQuiz (25) Merge Sort (25) Reverse Thinking (25) hihocoder (25) Company - LinkedIn (24) Hash (24) High Frequency (24) Summary (24) Divide and Conquer (23) Proof (23) Game Theory (22) Topological Sort (22) Lintcode - Review (21) Tree - Modification (21) Algorithm Game (20) CareerCup (20) Company - Twitter (20) DFS + Review (20) DP - Relation (20) Brain Teaser (19) DP - Tree (19) Left and Right Array (19) O(N) (19) Sweep Line (19) UVA (19) DP - Bit Masking (18) LeetCode - Thinking (18) KMP (17) LeetCode - TODO (17) Probabilities (17) Simulation (17) String Search (17) Codercareer (16) Company-Uber (16) Iterator (16) Number (16) O(1) Space (16) Shortest Path (16) itint5 (16) DFS+Cache (15) Dijkstra (15) Euclidean GCD (15) Heap (15) LeetCode - Hard (15) Majority (15) Number Theory (15) Rolling Hash (15) Tree Traversal (15) Brute Force (14) Bucket Sort (14) DP - Knapsack (14) DP - Probability (14) Difficult (14) Fast Power Algorithm (14) Pattern (14) Prefix Sum (14) TreeSet (14) Algorithm Videos (13) Amazon Interview (13) Basic Algorithm (13) Codechef (13) Combination (13) Computational Geometry (13) DP - Digit (13) LCA (13) LeetCode - DFS (13) Linked List (13) Long Increasing Sequence(LIS) (13) Math-Divisible (13) Reservoir Sampling (13) mitbbs (13) Algorithm - How To (12) Company - Microsoft (12) DP - Interval (12) DP - Multiple Relation (12) DP - Relation Optimization (12) LeetCode - Classic (12) Level Order Traversal (12) Prime (12) Pruning (12) Reconstruct Tree (12) Thinking (12) X Sum (12) AOJ (11) Bit Mask (11) Company-Snapchat (11) DP - Space Optimization (11) Dequeue (11) Graph DFS (11) MinMax (11) Miscs (11) Princeton (11) Quick Sort (11) Stack - Tree (11) 尺取法 (11) 挑战程序设计竞赛 (11) Coin Change (10) DFS+Backtracking (10) Facebook Hacker Cup (10) Fast Slow Pointers (10) HackerRank Easy (10) Interval Tree (10) Limited Range (10) Matrix - Traverse (10) Monotone Queue (10) SPOJ (10) Starting Point (10) States (10) Stock (10) Theory (10) Tutorialhorizon (10) Kadane - Extended (9) Mathblog (9) Max-Min Flow (9) Maze (9) Median (9) O(32N) (9) Quick Select (9) Stack Overflow (9) System Design (9) Tree - Conversion (9) Use XOR (9) Book Notes (8) Company-Amazon (8) DFS+BFS (8) DP - States (8) Expression (8) Longest Common Subsequence(LCS) (8) One Pass (8) Quadtrees (8) Traversal Once (8) Trie - Suffix (8) 穷竭搜索 (8) Algorithm Problem List (7) All Sub (7) Catalan Number (7) Cycle (7) DP - Cases (7) Facebook Interview (7) Fibonacci Numbers (7) Flood fill (7) Game Nim (7) Graph BFS (7) HackerRank Difficult (7) Hackerearth (7) Inversion (7) Kadane’s Algorithm (7) Manacher (7) Morris Traversal (7) Multiple Data Structures (7) Normalized Key (7) O(XN) (7) Radix Sort (7) Recursion (7) Sampling (7) Suffix Array (7) Tech-Queries (7) Tree - Serialization (7) Tree DP (7) Trie - Bit (7) 蓝桥杯 (7) Algorithm - Brain Teaser (6) BFS - Priority Queue (6) BFS - Unusual (6) Classic Data Structure Impl (6) DP - 2D (6) DP - Monotone Queue (6) DP - Unusual (6) DP-Space Optimization (6) Dutch Flag (6) How To (6) Interviewstreet (6) Knapsack - MultiplePack (6) Local MinMax (6) MST (6) Minimum Spanning Tree (6) Number - Reach (6) Parentheses (6) Pre-Sum (6) Probability (6) Programming Pearls (6) Rabin-Karp (6) Reverse (6) Scan from right (6) Schedule (6) Stream (6) Subset Sum (6) TSP (6) Xpost (6) n00tc0d3r (6) reddit (6) AI (5) Abbreviation (5) Anagram (5) Art Of Programming-July (5) Assumption (5) Bellman Ford (5) Big Data (5) Code - Solid (5) Code Kata (5) Codility-lessons (5) Coding (5) Company - WMware (5) Convex Hull (5) Crazyforcode (5) DFS - Multiple (5) DFS+DP (5) DP - Multi-Dimension (5) DP-Multiple Relation (5) Eulerian Cycle (5) Graph - Unusual (5) Graph Cycle (5) Hash Strategy (5) Immutability (5) Java (5) LogN (5) Manhattan Distance (5) Matrix Chain Multiplication (5) N Queens (5) Pre-Sort: Index (5) Quick Partition (5) Quora (5) Randomized Algorithms (5) Resources (5) Robot (5) SPFA(Shortest Path Faster Algorithm) (5) Shuffle (5) Sieve of Eratosthenes (5) Strongly Connected Components (5) Subarray Sum (5) Sudoku (5) Suffix Tree (5) Swap (5) Threaded (5) Tree - Creation (5) Warshall Floyd (5) Word Search (5) jiuzhang (5)

Popular Posts