01背包:
现在有 n 件物品,它们的重量分别是 W1,W2,...,Wn ,它们的价值分别为 C1 , C2 ,..., Cn ,求旅行者能获得最大总价值。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1005;
int m,n,vi[N],wi[N];
int f[N];
int main(){
scanf("%d %d",&m,&n);
for(int i=1;i<=n;i++){
scanf("%d %d",&vi[i],&wi[i]);
}
for(int i=1;i<=n;i++){
for(int j=m;j>=vi[i];j--){
f[j]=max(f[j],f[j-vi[i]]+wi[i]);
}
}
printf("%d",f[m]);
return 0;
}
完全背包:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1005;
int m,n,vi[N],wi[N];
int f[N];
int main(){
scanf("%d %d",&m,&n);
for(int i=1;i<=n;i++){
scanf("%d %d",&vi[i],&wi[i]);
}
for(int i=1;i<=n;i++){
for(int j=m;j>=vi[i];j--){
for(int k=0;k*vi[i]<=j;k++){
f[j]=max(f[j],f[j-k*vi[i]]+k*wi[i]);
}
}
}
printf("max=%d",f[m]);
return 0;
}
多重背包:
#include<iostream>
#include<cstdio>
using namespace std;
const int N=1005;
int n,m,maxx=0;
int a[N],w[N],c[N],f[N];
void fun(){
for(int i=1;i<=n;i++){
for(int j=m;j>=w[i];j--){
for(int k=0;k*w[i]<=j&&k<=a[i];k++){
f[j]=max(f[j],f[j-k*w[i]]+k*c[i]);
}
}
}
}
int main(){
scanf("%d %d",&m,&n);
for(int i=1;i<=n;i++){
scanf("%d %d %d",&w[i],&c[i],&a[i]);
}
fun();
printf("%d",f[m]);
return 0;
}
混合背包:
#include <bits/stdc++.h>
using namespace std;
const int maxn=35,maxm=210;
int dp[maxm];
int a[maxn],b[maxn],c[maxn];
int main(){
int n,m;
cin>>m>>n;
for(int i=1;i<=n;i++){
cin>>a[i]>>b[i]>>c[i];
if (c[i]==0){
c[i]=1e9;
}
}
for(int i=1;i<=n;i++){
for(int j=m;j>=a[i];j--){
for (int k=0;k<=c[i]&&k*a[i]<=j;k++){
dp[j]=max(dp[j],dp[j-k*a[i]]+k*b[i]);
}
}
}
cout<<dp[m];
return 0;
}