Bootstrap

多重背包模板 二进制优化


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

#include<iostream>
#include<string.h>
#include<string>
using namespace std;
const	int N=3;
const	int 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;
    }
}


;