POJ Dollar Dayz 美元假日(完全背包,常规+大数)
2015-05-09 11:16
239 查看
题意:给出整数n和k,n代表拥有的钱数量,k代表有k种工具,其价钱分别为1~k。求n元能有多少种购买的方案。
思路:k最大有100,数量过大,要用大数。其他的基本和完全背包一样。
AC代码
思路:k最大有100,数量过大,要用大数。其他的基本和完全背包一样。
#include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int B=1005, N=150; int coin[100], n, k; struct bign { //请先设置常数N作为缓冲区和最大整数的长度。 int len, sex; int s ; bign() { //创建一个新的大数 this -> len = 1; this -> sex = 0; memset(s, 0, sizeof(s)); } bign (int number) {*this = number;} //创建一个大数,用整型初始化 bign (const char* number) {*this = number;} //创建一个大数,用字符串初始化 void operator = (const char *number) { //重载等号,等于一个字符串 int begin = 0; len = 0; sex = 1; if (number[begin] == '-') { sex = -1; begin++; } else if (number[begin] == '+') begin++; for (int j = begin; number[j]; j++) s[len++] = number[j] - '0'; } bign operator = (int number) { //重载等号,等于一个整型 char str ; //注意这里的N,要设一个缓冲区在外面供使用。 sprintf(str, "%d", number); *this = str; return *this; } bign change(bign cur) { bign now; now = cur; for (int i = 0; i < cur.len; i++) now.s[i] = cur.s[cur.len - i - 1]; return now; } void delZore() { // 删除前导0. bign now = change(*this); while (now.s[now.len - 1] == 0 && now.len > 1) { now.len--; } *this = change(now); } void put() { // 输出数值。 delZore(); if (sex < 0 && (len != 1 || s[0] != 0)) cout << "-"; for (int i = 0; i < len; i++) cout << s[i]; } bign operator + (const bign &cur){ //只能是大数operator大数 bign sum, a, b; sum.len = 0; a = a.change(*this); b = b.change(cur); for (int i = 0, g = 0; g || i < a.len || i < b.len; i++){ int x = g; if (i < a.len) x += a.s[i]; if (i < b.len) x += b.s[i]; sum.s[sum.len++] = x % 10; g = x / 10; } return sum.change(sum); } bign operator - (const bign &cur) { //只能是大数operator大数 bign sum, a, b; sum.len = len; a = a.change(*this); b = b.change(cur); for (int i = 0; i < b.len; i++) { sum.s[i] = a.s[i] - b.s[i] + sum.s[i]; if (sum.s[i] < 0) { sum.s[i] += 10; sum.s[i + 1]--; } } for (int i = b.len; i < a.len; i++) { sum.s[i] += a.s[i]; if (sum.s[i] < 0) { sum.s[i] += 10; sum.s[i + 1]--; } } return sum.change(sum); } }; void cal() { dp[0]=1; for(int i=1; i<=n; i++) dp[i]=0; //初始化 int tmp=min(k,n); //k>n的部分买不起 for(int i=0; i<tmp; i++) for(int j=0; j+coin[i]<=n; j++) dp[j+coin[i]] = dp[j+coin[i]] + dp[j]; dp .put(); } int main() { //freopen("input.txt", "r", stdin); for(int i=0; i<100; i++) coin[i]=i+1; //初始化 while(~scanf("%d%d",&n,&k)) cal(); return 0; }
AC代码
相关文章推荐
- poj Dollar Dayz 3181 (DP&完全背包) 好题
- Dollar Dayz POJ - 3181 dp,完全背包,简单高精度加法
- POJ 3181 - Dollar Dayz(完全背包+高精度)
- POJ3181 Dollar Dayz-完全背包问题-高精度(大数)处理(附测试数据)
- poj 3181 Dollar Dayz dp 完全背包
- POJ 3181 Dollar Dayz 完全背包 + 高精度
- POJ_3181_Dollar_Dayz_(动态规划,完全部分和,完全背包)
- poj Dollar Dayz(完全背包)
- POJ 3181 Dollar Dayz (完全背包 + 大数分离输出)
- POJ 3181 Dollar Dayz (完全背包 + 大数分离输出)
- POJ 3181 Dollar Dayz (完全背包 + 大数分离输出)
- POJ 3181 Dollar Dayz (完全背包 + 大数分离输出)
- poj 3181 Dollar Dayz 钱币兑换问题 大数/高精度 完全背包
- Dollar Days POJ 3181 完全背包+高精度
- POJ 3181 Dollar Dayz (完全背包 + 大数分离输出)
- Dollar Days POJ 3181 完全背包+高精度
- POJ--3181--Dollar Dayz--背包/高精度
- POJ 3181 Dollar Dayz (完全背包 + 大数分离输出)
- Dollar Days POJ 3181 完全背包+高精度
- POJ 3181 Dollar Dayz (完全背包 + 大数分离输出)