动态规划-试题(4)-转移罪犯

来源:互联网 发布:python中执行shell脚本 编辑:程序博客网 时间:2024/06/03 11:46

转移罪犯

来源:百度2016研发工程师在线编程题
来源:http://t.cn/RyaLBmt

问题描述:
C市现在要转移一批罪犯到D市,C市有n名罪犯,按照入狱时间有顺序,另外每个罪犯有一个罪行值,值越大罪越重。现在为了方便管理,市长决定转移入狱时间连续的c名犯人,同时要求转移犯人的罪行值之和不超过t,问有多少种选择的方式?

分析

假设现在C市有10名罪犯,要转移3名,转移的罪行值不超过20。
罪犯的罪行值数组为:2-5-7-9-1-1-3-6-1-9

因为要按入狱顺序来,这给了我们很大的便利。我们先来看前3名能不能转移:2+5+7=16所以可以转移。然后我们去掉第1名,在加入第4名,发现5+7+9=21所以不能转移。接着继续去掉第2名,加入第5名,发现7+9+1=17所以可以转移。
如此下去就能找出所有能转移的方式了。

代码

public class Zuifanzhuanyi {    public static void main(String[] args){        Scanner scanner = new Scanner(System.in);        while (scanner.hasNext()){            handle(scanner);        }    }    public static void handle(Scanner scanner) {        int result = 0;//有多少种方法        /*收集数据*/        int n = scanner.nextInt();//C市罪犯总数        int t = scanner.nextInt();//转移罪行值不超过t        int c = scanner.nextInt();//转移罪犯数量        int[] size = new int[n];//每个罪犯的罪行值,在本程序中使用size表示罪行值        for (int i = 0; i < n; i++) {            size[i] = scanner.nextInt();        }        /*处理*/        int init = 0;        int currSize = 0;        //填充第一阶段        for (int i = 0; i < c; i++)            currSize += size[init + i];        if (currSize<=t)            result++;        //第二阶段        for (int i = c; i < n; i++) {            currSize += size[i];            currSize -= size[i-c];            if (currSize<=t)                result++;        }        System.out.println(result);    }}