2018icpc焦作赛区网络预选赛 K Transport Ship(多重背包二进制优化)

题意:

有n种物品,每种价值为aia_i,个数为2ci12^{c_i}-1。现在为你,使得总价值为S的方案树有几种

题解:

多重背包二进制优化裸题

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
const int mod=1e9+7;
int bit[maxn];
int a[maxn];
int dp[maxn];
int main()
{
	bit[0]=1;
	int T,n,m,i,j,k;
	for(i=1;i<=20;i++) bit[i]=bit[i-1]*2; 
	scanf("%d",&T);
	int A,C;
	while(T--)
	{
		int tot;
		scanf("%d%d",&n,&m);
		tot=0;
		memset(dp,0,sizeof(dp));
		for(i=0;i<n;i++)
		{
			scanf("%d%d",&A,&C);
			dp[0]=1;
			for(j=0;j<=C-1;j++)
			{
				a[tot++]=bit[j]*A%mod;
			}
		}
		for(i=0;i<tot;i++)
		{
			for(j=10000;j>=a[i];j--)
			{
				dp[j]=(dp[j]+dp[j-a[i]])%mod;
			}
		}
		while(m--)
		{
			int q;
			scanf("%d",&q);
//			cout<<dp[q]<<endl;
			printf("%d\n",dp[q]);
		}
	}
 } 

Q.E.D.