*背包问题(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; }
二进制优化版
又
相关文章推荐
- 背包问题【01、完全(恰好or不超过)、多重】【尚未整理完】
- 背包问题(01背包,完全背包,多重背包)
- 背包问题(01背包,完全背包,多重背包)
- 01背包,完全背包,多重背包问题详细介绍以及源代码实现
- 夕拾算法进阶篇:17)01背包和完全背包问题 (动态规划DP)
- 01背包、完全背包、多重背包问题分析
- 背包问题(01背包,完全背包,多重背包)
- DP背包问题小结(01背包,完全背包,需恰好装满或不需,一维DP、二维DP)
- 混合背包模板(01+多重+完全)
- 背包问题教程-01背包,完全背包,多重背包,混合背包
- 01背包问题和完全背包问题
- 背包(01背包、完全背包、多重背包)问题总结
- 背包问题总结(01背包、完全背包、多重背包)
- 01背包 完全背包问题
- 01背包、完全背包、多重背包、混合三种背包问题
- 01背包问题和完全背包问题,一个不理解的关键。
- 01背包问题和完全背包问题
- 01背包问题和完全背包问题
- 背包问题:01背包/完全背包
- 经典问题之01与完全背包总结