多重背包模板 二进制优化

来源:互联网 发布:linux if语句 编辑:程序博客网 时间:2024/06/05 03:50


背包为v  重量为w[i] 价值为p[i]  共有N个物品

#include<iostream>#include<string.h>#include<string>using namespace std;constint N=3;constint V=8;int w[N+1]={0,1,2,2};int v[N+1]={0,6,10,20};int num[N+1]={0,10,5,2};int f[N+1][V+1]={0};int main(){int n=0;for(int i=0;i<=N;i++)f[i][0]=0;for(int i=0;i<=V;i++)f[0][i]=0;//开始打表for(int i=1;i<=N;i++){for(int j=w[i];j<=V;j++){f[i][j]=0;n=min(num[i],j/w[i]);//可以放的个数for(int k=0;k<=n;k++)f[i][j]=max(f[i][j],f[i-1][j-k*w[i]]+k*v[i]);cout<<f[i][j]<<" ";}cout<<endl;}cout<<f[N][V]<<endl;return 0;}




多重背包加二进制优化

#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>#include <cmath>using namespace std;int main(){    int T,n,k,count;    int a[101],b[101];    int f[100001];    int i,j,m,p,g;    cin>>T;    while(T--)    {        memset(f,0,sizeof(f));        cin>>n;        for(i=1;i<=n;i++)            cin>>a[i];        for(i=1;i<=n;i++)            cin>>b[i];        cin>>k;        for(i=1;i<=n;i++)        {            p=0;            g=0;            while(b[i]>g)            {                for(j=k;j>=a[i]*g;j--)                {                    f[j]=max(f[j],f[j-a[i]*g]+a[i]*g);                }                b[i]-=g;                g=pow(2,p);                p++;            }            for(j=k;j>=a[i]*b[i];--j)            {                f[j]=max(f[j],f[j-a[i]*b[i]]+a[i]*b[i]);            }        }        if(f[k]==k)            cout<<"Yes"<<endl;        else            cout<<"No"<<endl;    }}


原创粉丝点击