题目大意,换工具,有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
1 #include <stdio.h> 2 #include <stdlib.h> 3 #include <string.h> 4 #define UP 1000000000000000000LL 5 #define CUT 18 6 7 static long long dpl[1001]; 8 static long long dph[1001]; 9 10 int main(void) 11 { 12 int sum, num, i, j; 13 long long k, tmp; 14 15 while (~scanf("%d%d", &sum, &num)) 16 { 17 dpl[0] = 1; 18 for (i = 1; i <= num; i++) 19 { 20 for (j = i; j <= sum; j++) 21 { 22 dpl[j] = dpl[j] + dpl[j - i]; 23 dph[j] = dph[j] + dph[j - i]; 24 if (dpl[j] >= UP) 25 { 26 dph[j]++; 27 dpl[j] = dpl[j] - UP; 28 } 29 } 30 } 31 if (dph[sum] != 0) 32 printf("%lld", dph[sum]); 33 printf("%lld\n", dpl[sum]); 34 } 35 return 0; 36 }