赞
踩
题目描述
有台奇怪的打印机有以下两个特殊要求:
输入:
s = “aaabbb”
输出:
2
解释:
首先打印 “aaa” 然后打印 “bbb”。
区间DP:
public int strangePrinter(String s) { int n = s.length(); int[][] f = new int[n][n]; for (int i = n - 1; i >= 0; i--) { f[i][i] = 1; for (int j = i + 1; j < n; j++) { if (s.charAt(i) == s.charAt(j)) { f[i][j] = f[i][j - 1]; } else { int minn = Integer.MAX_VALUE; for (int k = i; k < j; k++) { minn = Math.min(minn, f[i][k] + f[k + 1][j]); } f[i][j] = minn; } } } return f[0][n - 1]; }
题目描述
小明有一个容量为
V
V
V 的背包。
这天他去商场购物,商场一共有 N N N 种物品,第 i i i 种物品的体积为 w i w_i wi,价值为 v i v_i vi ,每种物品都有无限多个。
小明想知道在购买的物品总体积不超过
V
V
V 的情况下所能获得的最大价值为多少,请你帮他算算。
输入描述
输入第 11 行包含两个正整数
N
,
V
N,V
N,V,表示商场物品的数量和小明的背包容量。
第 2 ∼ N + 1 2\sim N+1 2∼N+1 行包含 2 个正整数 w , v w,v w,v,表示物品的体积和价值。
1 ≤ N ≤ 1 0 3 , 1 ≤ V ≤ 1 0 3 , 1 ≤ w i , v i ≤ 1 0 3 1\leq N\leq10^3, 1≤V≤10^3,1 \leq w_i, v_i \leq 10^3 1≤N≤103,1≤V≤103,1≤wi,vi≤103
输入:
5 20
1 6
2 5
3 8
5 15
3 3
输出:
120
完全背包问题,不需要明确的物品阶段划分,所以只需要一维数组 d p dp dp即可,每次计算中动态更新 d p dp dp 数组的值。
i
时,背包能够容纳的最大价值。w[i]
为第i
个物品的重量,v[i]
为第k
个物品的价值public class Main { public static void main(String[] args) { Scanner scan = new Scanner(System.in); //在此输入您的代码... int n = scan.nextInt(), volume = scan.nextInt(); int[] w = new int[n]; int[] v = new int[n]; int[] dp = new int[volume+1]; for(int i = 0; i < n; i++){ w[i] = scan.nextInt(); v[i] = scan.nextInt(); } for(int i = 1; i <= volume; i++){ for(int j = 0; j < n; j++){ if(i >= w[j]){ dp[i] = Math.max(dp[i], dp[i-w[j]]+v[j]); } } } System.out.println(dp[volume]); scan.close(); } }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。