算法题之动态规划

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法题之动态规划相关的知识,希望对你有一定的参考价值。

题目来源:牛客网

 

众所周知计算机代码底层计算都是0和1的计算,牛牛知道这点之后就想使用0和1创造一个新世界!牛牛现在手里有n个0和m个1,给出牛牛可以创造的x种物品,每种物品都由一个01串表示。牛牛想知道当前手中的0和1可以最多创造出多少种物品。

 

输入描述:

输入数据包括x+1行:
第一行包括三个整数x(2 ≤ x ≤ 20),n(0 ≤ n ≤ 500),m(0 ≤ m ≤ 500),以空格分隔
接下来的x行,每行一个01串item[i],表示第i个物品。每个物品的长度length(1 ≤ length ≤ 50)

输出描述:

输出一个整数,表示牛牛最多能创造多少种物品

输入例子:
3 3 1
1
00
100

输出例子:
2

 

Java实现:

import java.util.Scanner;

public class Main
{
    public static void main(String[] args)
    {
        Scanner scanner = new Scanner(System.in);
        int num_item = scanner.nextInt();
        int num_0 = scanner.nextInt();
        int num_1 = scanner.nextInt();

        int count = 0;
        int[] array_0 = new int[21];
        int[] array_1 = new int[21];
        for (int i = 1 ; i <= num_item; i++)
        {
            char[] array = scanner.next().toCharArray();
            for (char anArray : array)
            {
                if (anArray == ‘0‘)
                    array_0[i]++;
                else
                    array_1[i]++;
            }
        }
        scanner.close();

        //二维动态规划,背包问题
        int[][] dp = new int[501][501];
        for (int i = 1 ; i <= num_item; i++)
        {
            for (int j = num_0 ; j >= array_0[i] ; j--)
            {
                for (int k = num_1 ; k >= array_1[i] ; k--)
                {
                    dp[j][k] = Math.max(dp[j][k], dp[j-array_0[i]][k-array_1[i]]+1);
                    // 输出每一步的结果
                    //System.out.println("dp["+j+"]["+k+"] = Math.max(dp["+j+"]["+k+"], dp["+j+"-array_0["+i+"]]["+k+"-array_1["+i+"]]+1);");
                }
            }
        }
        System.out.print(dp[num_0][num_1]);
    }
}

  

以上是关于算法题之动态规划的主要内容,如果未能解决你的问题,请参考以下文章

动态规划经典题之年终奖

PAT刷题之动态规划专题

Leetcode刷题之动态规划

Leetcode刷题之动态规划(Java)

算法题之字符串匹配问题

详细实例说明+典型案例实现 对动态规划法进行全面分析 | C++