(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