DP:Dollar Dayz(POJ 3181)

时间:2023-12-04 16:21:08

                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]-Up;

  而且更关键的是,这一题根本就是个错题,因为低位根本不需要加前导0就给过,加了就tle

  

 #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define UP 1000000000000000000LL
#define CUT 18 static long long dpl[];
static long long dph[]; int main(void)
{
int sum, num, i, j;
long long k, tmp; while (~scanf("%d%d", &sum, &num))
{
dpl[] = ;
for (i = ; i <= num; i++)
{
for (j = i; j <= sum; j++)
{
dpl[j] = dpl[j] + dpl[j - i];
dph[j] = dph[j] + dph[j - i];
if (dpl[j] >= UP)
{
dph[j]++;
dpl[j] = dpl[j] - UP;
}
}
}
if (dph[sum] != )
printf("%lld", dph[sum]);
printf("%lld\n", dpl[sum]);
}
return ;
}