2018icpc焦作赛区网络预选赛 K Transport Ship(多重背包二进制优化)
题意:
有n种物品,每种价值为,个数为。现在为你,使得总价值为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.