---------------------------背包问题
01背包 //01背包每个物品只能选一个,物品个数为1
#include <iostream>
using namespace std;
int main(){
int w[MAXN],c[MAXN];
int dp[MAXN];
int N,V; //N为总背包大小,V为物品体积
cin>>N>>V;
for(int i=1;i<=N;i++){
cin>>w[i]>>c[i];
}
for(int i=1;i<=N;i++){
for(int j=V;j>=C[i];j--){
dp[j]=max(dp[j-C[i]]+W[i],dp[j]);
}
}
cout<<dp[v];
return 0;
}
多重背包 //物品个数有限
#include <iostream>
using namespace std;
int main(){
int w[MAXN],c[MAXN],n[MAXN];
int dp[MAXN];
int N,V; //N为总背包大小,V为物品体积
cin>>N>>V;
for(int i=1;i<=N;i++){
cin>>W[i]>>C[i]>>N[i];
}
for(int i=1;i<=N;i++){
for(int j=v;j>=0;j--){
for(int k=0;k<=n[j];k++){
dp[j]=max(dp[j-c[i]*k]+w[i]*k,dp[j]);
}
}
cout<<dp[v]<<endl;
return 0;
}
完全背包 //完全背包问题可以多次选一个物品。物品可以有无限个
#include <iostream>
using namespace std;
int main(){
int w[MAXN],c[MAXN],
int dp[MAXN];
int N,V; //N为总背包大小,V为物品体积
cin>>N>>V;
for(int i=1;i<=N;i++){
cin>>w[i]>>c[i];
}
for(int i=1;i<=N;i++){
for(int j=C[i];j<=V;j++){
dp[j]=max(dp[j-C[i]]+W[i],dp[j]);
}
}
cout<<dp[v];
return 0;
}
---------------------------