AcWing算法基础课第五讲


(typora要清理,暂时上传避免丢了)

#2 01背包问题

题目描述

有 /(N/) 件物品和一个容量是 /(V/) 的背包。每件物品只能使用一次。

第 /(i/) 件物品的体积是 /(v_i/),价值是 /(w_i/)。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。
输出最大价值。

试解

#include "iostream"
#include <bits/stdc++.h>
using namespace std;
int bag[1010],w[1010],v[1010],N,V;
int main(){
    cin>>N>>V;
    for(int i=1;i<=N;i++){
        cin>>w[i]>>v[i];
    }
    for(int i=1;i<=N;i++)
    {
        for(int j=V;j>=0;j--)
        {
            if(j>=w[i])
            {
                bag[j]=max(bag[j-w[i]]+v[i], bag[j]);
            }
        }
    }
    cout<<bag[V];
    return 0;
}

批改

A了

分析

还好没忘。最一开始学的时候,还写了一个带备忘录的贪心,不算是发明,道理本质上一样。

#include "iostream"
#include <bits/stdc++.h>
using namespace std;
int bag[1010],w,v,N,V;
int main(){
    cin>>N>>V;
    for(int i=1;i<=N;i++){
        cin>>w>>v;
        for(int j=V;j>=0;j--)
            if(j>=w)bag[j]=max(bag[j-w]+v, bag[j]);
    }
    cout<<bag[V];
    return 0;
}

比较基础,不放板子。

#3 完全背包问题

有 /(N/) 种物品和一个容量是 /(V/) 的背包,每种物品都有无限件可用。

第 ii 种物品的体积是 /(v_i/),价值是 /(w_i/)。

求解将哪些物品装入背包,可使这些物品的总体积不超过背包容量,且总价值最大。输出最大价值。

试解

#include "iostream"
#include <bits/stdc++.h>
using namespace std;
int bag[1010],w,v,N,V;
int main(){
    cin>>N>>V;
    for(int i=1;i<=N;i++){
        cin>>w>>v;
        for(int j=0;j<=V;j++)
            if(j>=w)bag[j]=max(bag[j-w]+v, bag[j]);
    }
    cout<<bag[V];
    return 0;
}

批改

A了

分析

也没忘。

比较基础,不放板子。

试解

批改

分析

试解

批改

分析

原创文章,作者:6024010,如若转载,请注明出处:https://blog.ytso.com/275293.html

(0)
上一篇 2022年7月19日
下一篇 2022年7月19日

相关推荐

发表回复

登录后才能评论