算法题之创造新世界(动态规划)
题目来源:牛客网
众所周知计算机代码底层计算都是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]); } }