您的位置:首页 > 其它

*背包问题(01+完全+多重)

2017-07-11 11:49 337 查看
今天是2017/7/11,DCDCBigBig的第二十六篇博文


背包问题应该算是最最基础的DP入门了吧。。。这几天在搞奇怪的DP,无聊来发发背包^_^

背包问题

01背包(一维优化)

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int n,v,f[10001],c[10001],w[10001];
int main(){
memset(f,0,sizeof(0));
scanf("%d%d",&n,&v);
for(int i=1;i<=n;i++)scanf("%d%d",&c[i],&w[i]);
for(int i=1;i<=n;i++){
for(int j=v;j>=c[i];j--){
f[j]=max(f[j],f[j-c[i]]+w[i]);
}
}
printf("%d",f[v]);
return 0;
}


完全背包

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int n,v,f[10001],c[10001],w[10001];
int main(){
memset(f,0,sizeof(0));
scanf("%d%d",&n,&v);
for(int i=1;i<=n;i++)scanf("%d%d",&c[i],&w[i]);
for(int i=1;i<=n;i++){
for(int j=c[i];j<=v;j++){
f[j]=max(f[j],f[j-c[i]]+w[i]);
}
}
printf("%d",f[v]);
return 0;
}


多重背包

无优化暴力版

#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
int n,v,f[1001][1001],c[1001],w[1001],m[1001];
int main(){
memset(f,0,sizeof(f));
scanf("%d%d",&n,&v);
for(int i=1;i<=n;i++)scanf("%d%d%d",&c[i],&w[i],&m[i]);
for(int i=1;i<=n;i++){
for(int j=0;j<=v;j++){
for(int k=0;k<=m[i]&&k*c[i]<=j;k++){
f[i][j]=max(f[i][j],f[i-1][j-k*c[i]]+k*w[i]);
}
}
}
printf("%d",f
[v]);
return 0;
}


二进制优化版



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 dp 背包问题