大家好,我是晴天学长,dp的题,分析dp的状态,需要的小伙伴可以关注支持一下哦!后续会继续更新的。💪💪💪
1) .小蓝健身
2) .算法思路
1.设置状态为dp【n】【m】为装配到n,m情况时,是都能满足条件。
2.是一个Boolean类型的dp。
3).算法步骤
创建一个Scanner对象,用于从控制台读取输入。
读取两个整数a和b,分别表示背包的容量。
创建一个二维布尔数组dp,大小为(a+1)×(b+1),用于记录每个状态是否可达。
将dp[0][0]设置为true,表示背包容量为0时可达。
读取一个整数n,表示物品的数量。
使用循环遍历每个物品:
a. 读取一个整数x,表示当前物品的重量。
b. 从a到0的逆序遍历j,从b到0的逆序遍历k,判断是否可以将当前物品放入背包:
若j>=x且dp[j-x][k]为true,则将dp[j][k]设置为true。
若k>=x且dp[j][k-x]为true,则将dp[j][k]设置为true。
若dp[a][b]为true,则输出"YES";否则,输出"NO"。
关闭Scanner对象。
4). 代码实例
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int b = scanner.nextInt();
boolean[][] dp = new boolean[a+1][b+1];
dp[0][0] = true;
int n = scanner.nextInt();
for (int i = 0; i < n; i++) {
int x = scanner.nextInt();
for (int j = a; j >=0; j--) {
for (int k = b; k >=0; k--) {
if (j>=x&&dp[j-x][k]) {
dp[j][k]=true;
}
if (k>=x&&dp[j][k-x]) {
dp[j][k] = true;
}
}
}
}
if (dp[a][b]) {
System.out.println("YES");
}
else {
System.out.println("NO");
}
}
}
5). 总结
- dp的状态有几种表示方式,可以在做题的时候回想一下。