您的位置:首页 > 其它

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

2015-05-09 11:16 239 查看
题意:给出整数n和k,n代表拥有的钱数量,k代表有k种工具,其价钱分别为1~k。求n元能有多少种购买的方案。

思路: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代码
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: