首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >动态规划二维费用的背包问题系列一>盈利计划

动态规划二维费用的背包问题系列一>盈利计划

作者头像
用户11305962
发布2025-04-02 08:34:20
发布2025-04-02 08:34:20
1300
举报
文章被收录于专栏:学习学习

题目解析:

链接: link

状态表示:

状态转移方程:

初始化:

填表顺序:

根据状态转移方程,i 从小到大即可

返回值:

返回:dp[len][n][minProfit]

代码呈现:

代码语言:javascript
复制
class Solution {
    public int profitableSchemes(int n, int minProfit, int[] group, int[] profit) {
        int len = group.length;
        int MOD = (int)1e9 + 7;
        int[][][] dp = new int[len+1][n+1][minProfit+1];

        for(int i = 0; i <= n; i++) dp[0][i][0] = 1;

        for(int i = 1; i <= len; i++)
            for(int j = 0; j <= n; j++)
                for(int k = 0; k <= minProfit; k++){
                    dp[i][j][k] = dp[i-1][j][k];
                    if(j >= group[i-1]){
                        dp[i][j][k] = dp[i-1][j][k] + dp[i-1][j-group[i-1]][Math.max(0,k-profit[i-1])];
                        dp[i][j][k] %= MOD;
                    }
                }

        return dp[len][n][minProfit];        
    }
}

空间优化版本:

代码语言:javascript
复制
class Solution {
    public int profitableSchemes(int n, int minProfit, int[] group, int[] profit) {
        int len = group.length;
        int MOD = (int)1e9 + 7;
        int[][] dp = new int[n+1][minProfit+1];

        for(int i = 0; i <= n; i++) dp[i][0] = 1;

        for(int i = 1; i <= len; i++)
            for(int j = n; j >= group[i-1]; j--)
                for(int k = minProfit; k >= 0; k--){
                    dp[j][k] = dp[j][k] + dp[j-group[i-1]][Math.max(0,k-profit[i-1])];
                    dp[j][k] %= MOD;
                }

        return dp[n][minProfit];        
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-04-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 题目解析:
  • 状态表示:
  • 状态转移方程:
  • 初始化:
  • 填表顺序:
  • 返回值:
  • 代码呈现:
  • 空间优化版本:
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档