牛客网NOIP2001装箱问题

这是别人的代码,我只能看出原理大概类似二维数组,能为我解答一下为什么选择f[j-v]吗


#include
using namespace std;

const int N = 20010;
int f[N]={0};
int n, m;

int main(){
    cin>>m;
    cin>>n;
    
    for(int i = 1; i <= n; i++){
        int v;
        cin>>v;
        for(int j = m; j >= v; j--)
            f[j] = max(f[j] , f[j-v] + v);
    }
    
    cout<return 0;
}

常规解法: f[i][j]表示背包容量为j时,前i个物品能放的最小剩余空间,你这种是省空间的写法,简化了但是思想是一样的

def func():
    f = [[V for i in range(V + 1)] for j in range(n + 1)]
    for i in range(1, n + 1):
        for j in range(0, V + 1):
            if j >= a[i]:
                f[i][j] = min(f[i - 1][j], f[i - 1][j - a[i]] - a[i])
            else:
                f[i][j] = f[i - 1][j]
    print(f[n][V])
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!
PS:问答VIP年卡 【限时加赠:IT技术图书免费领】,了解详情>>> https://vip.csdn.net/askvip?utm_source=1146287632