01背包问题的空间优化

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.
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值