解题思路:做这道题的时候,一看就知道是动态规划,但不太会看了题解有了想法,参考题解【码蹄集进阶塔全题解16】动态规划:MT2158 – MT2163_哔哩哔哩_bilibili
参考思路:九种 0-1 背包问题详解_0-1背包问题_Tyler_Zx的博客-CSDN博客
背包最大容量=初始粮食X
每一个物品的价值=(n-i+1)*c[i]
数组dp[i][j]代表第i天,粮食为j的情况下可以容纳的动物数量最大值
对于第I天接纳这只动物dp[i][j]=dp[i-1][j-w[i]]+1;
不接纳这只动物 dp[i][j]=dp[i-1][j]
动态规划公式dp[i][j]=max(dp[i-1][j-w[i]]+1,dp[i-1][j])
import java.util.Scanner;
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// code here
int n,x;
int max=0;
n=input.nextInt();
x=input.nextInt();
int c[]=new int[n+1];
for(int i=1;i<n+1;i++){
c[i]=input.nextInt();
c[i]=c[i]*(n-i+1);
}
int dp[][]=new int[n+1][x+1];
for(int i=1;i<=n;i++){
for(int j=1;j<=x;j++){
dp[i][j]=dp[i-1][j];
if(j>c[i]){
dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-c[i]]+1);
}
}
}
System.out.println(dp[n][x]);
input.close();
}
}
当然也可以简化为1维数组
import java.util.Scanner;
import java.util.*;
class Main {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
// code here
int n,x;
int max=0;
n=input.nextInt();
x=input.nextInt();
int c[]=new int[n+1];
for(int i=1;i<n+1;i++){
c[i]=input.nextInt();
c[i]=c[i]*(n-i+1);
max=Math.max(max,c[i]);
}
max=Math.max(max,x);
int dp[]=new int[max+1];
for(int i=1;i<=n;i++){
for(int j=x;j>=c[i];j--){//01背包倒着写,完全背包顺这些
dp[j]=Math.max(dp[j],dp[j-c[i]]+1);
}
}
System.out.println(dp[x]);
input.close();
}
}