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 coin[100], n, k;
  8
  9 struct bign {       //请先设置常数N作为缓冲区和最大整数的长度。
 10     int len, sex;
 11     int s[N];
 12
 13     bign() {    //创建一个新的大数
 14         this -> len = 1;
 15         this -> sex = 0;
 16         memset(s, 0, sizeof(s));
 17     }
 18     bign (int number) {*this = number;}     //创建一个大数,用整型初始化
 19     bign (const char* number) {*this = number;} //创建一个大数,用字符串初始化
 20
 21     void operator = (const char *number) {  //重载等号,等于一个字符串
 22         int begin = 0;
 23         len = 0;
 24         sex = 1;
 25         if (number[begin] == ‘-‘) {
 26             sex = -1;
 27             begin++;
 28         }
 29         else if (number[begin] == ‘+‘)
 30             begin++;
 31
 32         for (int j = begin; number[j]; j++)
 33             s[len++] = number[j] - ‘0‘;
 34     }
 35
 36     bign operator = (int number) {          //重载等号,等于一个整型
 37         char str[N];        //注意这里的N,要设一个缓冲区在外面供使用。
 38         sprintf(str, "%d", number);
 39         *this = str;
 40         return *this;
 41     }
 42
 43     bign change(bign cur) {
 44         bign now;
 45         now = cur;
 46         for (int i = 0; i < cur.len; i++)
 47             now.s[i] = cur.s[cur.len - i - 1];
 48         return now;
 49     }
 50
 51     void delZore() {    // 删除前导0.
 52         bign now = change(*this);
 53         while (now.s[now.len - 1] == 0 && now.len > 1) {
 54             now.len--;
 55         }
 56         *this = change(now);
 57     }
 58
 59     void put() {    // 输出数值。
 60         delZore();
 61         if (sex < 0 && (len != 1 || s[0] != 0))
 62             cout << "-";
 63         for (int i = 0; i < len; i++)
 64             cout << s[i];
 65     }
 66
 67     bign operator + (const bign &cur){      //只能是大数operator大数
 68         bign sum, a, b;
 69         sum.len = 0;
 70         a = a.change(*this);
 71         b = b.change(cur);
 72
 73         for (int i = 0, g = 0; g || i < a.len || i < b.len; i++){
 74             int x = g;
 75             if (i < a.len) x += a.s[i];
 76             if (i < b.len) x += b.s[i];
 77             sum.s[sum.len++] = x % 10;
 78             g = x / 10;
 79         }
 80         return sum.change(sum);
 81     }
 82
 83     bign operator - (const bign &cur) {     //只能是大数operator大数
 84         bign sum, a, b;
 85         sum.len = len;
 86         a = a.change(*this);
 87         b = b.change(cur);
 88
 89         for (int i = 0; i < b.len; i++) {
 90             sum.s[i] = a.s[i] - b.s[i] + sum.s[i];
 91             if (sum.s[i] < 0) {
 92                 sum.s[i] += 10;
 93                 sum.s[i + 1]--;
 94             }
 95         }
 96         for (int i = b.len; i < a.len; i++) {
 97             sum.s[i] += a.s[i];
 98             if (sum.s[i] < 0) {
 99                 sum.s[i] += 10;
100                 sum.s[i + 1]--;
101             }
102         }
103         return sum.change(sum);
104     }
105 };
106
107 void cal()
108 {
109     dp[0]=1;
110     for(int i=1; i<=n; i++)  dp[i]=0; //初始化
111     int tmp=min(k,n);   //k>n的部分买不起
112     for(int i=0; i<tmp; i++)
113         for(int j=0; j+coin[i]<=n; j++)
114             dp[j+coin[i]] = dp[j+coin[i]] + dp[j];
115
116     dp[n].put();
117 }
118
119 int main() {
120     //freopen("input.txt", "r", stdin);
121     for(int i=0; i<100; i++)    coin[i]=i+1;    //初始化
122     while(~scanf("%d%d",&n,&k))
123         cal();
124     return 0;
125 }

AC代码

时间: 2024-10-14 07:52:36

POJ 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

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

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 s

poj 1837 Balance (dp,01背包)

链接:poj 1837 题意:有一个天平,天平左右两边各有若干个钩子,总共有C个钩子,有G个钩码, 求将钩码挂到钩子上使天平平衡的方法的总数.其中可以把天枰看做一个以x轴0点作为平衡点的横轴 分析:力臂=重量 *臂长 = g[i]*c[j] 当平衡度k=0时,说明天枰达到平衡,k>0,说明天枰倾向右边(x轴右半轴),k<0则左倾 因此可以定义一个 状态数组dp[i][k],意为在挂满前i个钩码时,平衡度为k的挂法的数量. 由于距离c[i]的范围是-15~15,钩码重量的范围是1~25,钩码数量

POJ 2392 Space Elevator(贪心+多重背包)

POJ 2392 Space Elevator(贪心+多重背包) http://poj.org/problem?id=2392 题意: 题意:给定n种积木,每种积木都有一个高度h[i],一个数量num[i],还有一个限制条件,这个积木所在的位置不能高于limit[i],问能叠起的最大高度? 分析: 本题是一道多重背包问题, 不过每个物品的选择不仅仅要受该种物品的数量num[i]限制, 且该物品还受到limit[i]的限制. 这里有一个贪心的结论: 我们每次背包选取物品时都应该优先放置当前limi

POJ 3628 Bookshelf 2 0/1背包和DFS两种解法

题目链接:POJ 3628 Bookshelf 2 Bookshelf 2 Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 7462   Accepted: 3436 Description Farmer John recently bought another bookshelf for the cow library, but the shelf is getting filled up quite quickly,

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

(完全背包 大数)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

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的输出格式控制,