Timus 1036 Lucky Tickets

来源:互联网 发布:新款java小轮车 编辑:程序博客网 时间:2024/06/05 18:36
import java.io.*;import java.math.BigInteger;import java.util.*; public class Main {    public static void main (String [] args) throws Exception {        Scanner scan = new Scanner(System.in);        int n = scan.nextInt();        int s = scan.nextInt();        if(s%2==1){            System.out.println(0);            return;        }        int t = s/2;        BigInteger dp[][] = new BigInteger[n+1][t+1];        for(int i=0;i<=n;i++)            Arrays.fill(dp[i], BigInteger.ZERO);        dp[0][0] = BigInteger.ONE;        for(int i=1;i<=n;i++){            for(int j=0;j<=t;j++){                for(int k=0;k<=Math.min(9, j);k++){                    dp[i][j] = dp[i][j].add(dp[i-1][j-k]);                }            }        }        System.out.println(dp[n][t].multiply(dp[n][t]));    }} 

题目倒是不难,做过一定量题目的基本一眼能看出这是个类似背包的东西

背包容量是S/2, 货物可取的值是0到9

一个背包的变形在于限制了物品的数量,不是任意件物品了。

DP公式见以上代码,所以思路还是不难想的。


比较坑的是各种陷阱,首先S不能是奇数,其次 1,20这样的测试数据必须返回0

也就是K的循环上限要注意,(第二次WA在这里)

然后就是坑爹的数据范围,我直接上了long, 过了7个case

我在想一般的题目不用到bigInteger吧,不是坑C++的大数字操作吗。。。


不用这么狠吧,搞得非bigInteger才能过去, 何必呢。

可能是由于最后是dp[n][t]的平方,所以Long也越界了。。。。

最后换BigInteger就顺过去了~~~~~