509. 斐波那契数
class Solution {
public int fib(int n) {
if(n <= 1) return n;
int a = 1;
int b = 1;
int sum = a;
for (int i = 2; i < n; i++) {
sum = a + b;
a = b;
b = sum;
}
return sum;
}
}
70. 爬楼梯
class Solution {
public int climbStairs(int n) {
//爬楼梯其实是一个斐波那契数列
if(n <= 2) return n;
int a = 1;
int b = 2;
int sum = 0;
for (int i = 3; i <= n; i++) {
sum = a + b;
a = b;
b = sum;
}
return sum;
}
}
0-1背包问题
class Solution {
public static void main(String[] args) {
int[] weight = {1, 3, 4};//物品的重量
int[] value = {15, 20, 30};//物品的价值
int bagsize = 4;//背包的最大容量
//testweightbagproblem(weight, value, bagsize);//二维数组实现
testweightbagproblem2(weight, value, bagsize);//一维滚动数组实现
}
public static void testweightbagproblem2(int[] weight, int[] value, int bagsize){
//定义一维dp数组:dp[j] 表示背包容量为j时,可以获得的最大价值
int[] dp = new int[bagsize + 1];//这边+1的情况是,要加上背包容量为0的情况
//初始化是不需要的,因为所有的物品价值都是正数,所以int的初始值0会被覆盖
for (int i = 0; i < weight.length; i++) {//物品
for (int j = bagsize; j >= weight[i]; j--) {//背包必须是倒叙,否则前面的物品会放入多次
//dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
if(weight[i] > j){//如果第i个物体太大了,放不进去
dp[j] = dp[j];
}else{
dp[j] = Math.max(dp[j], dp[j - weight[i]] + value[i]);
}
}
}
//遍历dp数组
for (int i = 0; i < dp.length; i++) {
System.out.print(dp[i] + " ");
}
}
public static void testweightbagproblem(int[] weight, int[] value, int bagsize){
//定义dp数组:dp[i][j]表示背包容量为j时,前i个物品能获得的最大价值
int[][] dp = new int[weight.length][bagsize+1];
//初始化二维数组的第一行:如果可以放下第一个物品,那么价值就为第一个物品的价值
for (int i = 0; i < bagsize+1; i++) {
if(i >= weight[0]){
dp[0][i] = value[0];
}
}
//物品有两种选择:放/不放
//不放 dp[i][j] = dp[i-1][j]
//放 dp[i][j] = dp[i-1][j - weight[i]] +value[i]
for (int i = 1; i < weight.length; i++) {//物品
for (int j = 1; j < bagsize+1; j++) {//背包
if(weight[i] > j){//如果第i个物体太大了,放不进去
dp[i][j] = dp[i-1][j];
}else{
dp[i][j] = Math.max(dp[i-1][j], dp[i-1][j - weight[i]] +value[i]);
}
}
}
//打印dp数组
for (int i = 0; i < weight.length; i++) {
for (int j = 0; j < bagsize+1; j++) {
System.out.print(dp[i][j] + " ");
}
System.out.println();
}
}
}