LintCode : 背包问题 II

LintCode : 背包问题 II

给出n个物品的体积A[i]和其价值V[i],将他们装入一个大小为m的背包,最多能装入的总价值有多大?

您在真实的面试中是否遇到过这个题?


典型的01背包问题,动态规划解决。

状态转移方程:

  • ans[i][j] = max ( ans[i-1][j-A[i-1]] + V[i-1], ans[i-1][j-1] ) 当(j >= V[i])时。

  • ans[i][j] = ans[i-1][j] 当(j < V[i]) 时

  • ans[i][j] = 0 当(i==0 || j == 0时)

这里需要注意ans数组共有(n+1) * (m+1)个元素。


class Solution {
public:
    /**
     * @param m: An integer m denotes the size of a backpack
     * @param A & V: Given n items with size A[i] and value V[i]
     * @return: The maximum value
     */
    int backPackII(int m, vector<int> A, vector<int> V) {
        // write your code here
        int n = A.size();
        vector<vector<int> > ans(n+1, vector<int>(m+1));
        for(int i=0; i<=n; i++){
            for(int j=0; j<=m; j++){
                if(i==0 || j==0){
                    ans[i][j] = 0;
                }
                else {
                    if(j >= A[i-1]){
                        ans[i][j] = max((ans[i-1][j-A[i-1]] + V[i-1]), ans[i-1][j]);
                    }
                    else{
                        ans[i][j] = ans[i-1][j];
                    }

                }
            }
        }
        return ans[n][m];
    }
};

CSDN上的一位朋友讲解的背包问题感觉思路很清晰,链接在这。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值