01背包
以下代码为各类背包问题代码标准例题答案
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
int w[MAXN]; // 重量
int v[MAXN]; // 价值
int f[MAXN][MAXN]; // f[i][j], j重量下前i个物品的最大价值
int main()
{
int n, m;
cin >> n >> m;
for(int i = 1; i <= n; ++i)
cin >> w[i] >> v[i];
for(int i = 1; i <= n; ++i)
for(int j = 1; j<=m; ++j)
{
// 当前重量装不进,价值等于前i-1个物品
if(j<w[i])
f[i][j] = f[i-1][j];
// 能装,需判断
else
f[i][j] = max(f[i-1][j], f[i-1][j-w[i]]+v[i]);
}
cout<<f[n][m]<<endl;
return 0;
}
完全背包1维dp
#include<bits/stdc++.h>
using namespace std;
int n,v;
int tiji[10001];
int jiazhi[10001];
int ans[10001];
int main()
{
cin>>n>>v;
for(int i=1;i<=n;i++){
cin>>tiji[i]>>jiazhi[i];
}
for(int i=1;i<=n;i++){
for(int j=0;j<=v;j++){
if(j>=tiji[i]){
ans[j]=max(ans[j],ans[j-tiji[i]]+jiazhi[i]);
}
}
}
cout<<ans[v]<<endl;
return 0;
}
多重背包
#include<bits/stdc++.h>
using namespace std;
int number[200];
int tiji[200];
int jiazhi[200];
int ans[10001];
int n,v;
int main(){
cin>>n>>v;
for(int i=1;i<=n;i++){
cin>>tiji[i]>>jiazhi[i]>>number[i];
}
for(int i=1;i<=n;i++){
for(int j=v;j>=tiji[i];j--){
for(int k=0;k<=number[i];k++){
if(k*tiji[i]<=j){
ans[j]=max(ans[j],ans[j-k*tiji[i]]+k*jiazhi[i]);
}
}
}
}
cout<<ans[v]<<endl;
return 0;
}