oj地址:01背包。
首先说一下这道题引发的思考,我习惯把状态转移方程称作小单元,它一般是以一个单元格为计算单位的递推过程,然后在小单元之上,我又把行与行之间的关系,称作大单元。很多动态规划的题,一个单元格一般依赖于其他几个单元格,这是从单元格的角度上去看问题,如果从行的角度去看问题,很多的都是一行上的数据,只会依赖固定的一行或者几行,这里就是空间优化的出发点。比如一个二维表的空间是O(mn)的,而发现其第i行永远只依赖第i-1行,那么就可以只给它分配两行,然后循环使用。
1.最初始的解决方法。
import java.util.*;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
while(sc.hasNext()){
int C=sc.nextInt();
int N=sc.nextInt();
int[] V=new int[N+1];//评价
int[] P=new int[N+1];//价格
int[][] dp=new int[N+1][C+1];//表示dp[i][j]表示前i件放入容量为j的背包时的最大评价
for(int i=1;i<=N;i++){
P[i]=sc.nextInt();
V[i]=sc.nextInt();
}
//第一行都为0,java里省去初始化
for(int i=1;i<=N;i++){
for(int j=0;j<=C;j++){
if(j-P[i]>=0){
dp[i][j]=Math.