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

xiaoxiao2021-02-28  135

今天是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[n][v]); return 0; }

二进制优化版


转载请注明原文地址: https://www.6miu.com/read-59930.html

最新回复(0)