给定n个大小为a[i]的物品与一个大小为m的背包,你需要回答q次询问,每次询问会给出k个标号为b[i]物品,你需要回答在这k个物品不能被选择的情况下,有多少种选择物品的方案,使得背包能够容纳被选择的物品。每个物品只有一件。两种方案不同当且仅当存在一个物品,在这两种方案中选择的情况不同。由于答案可能很大,你需要输出答案对1000000007取模的结果。不同的询问是互相独立的,也就是说,如果第一个询问b[i]中出现了1但第二个询问中没有,那么第二个询问中允许将第1个物品放入背包。
数据范围: n、m、q小于等于3000,所有询问的k之和不超过3000
提示:在回答询问之前求出f[i]表示物品占用背包容量为i的方案数,在每次回答询问时考虑加入一个物品时对f[i]进行改变的逆过程。
#include<cstdio> const int N=3010,mod=1000000007; int f[N],g[N],ans,i,j,n,m,q,a[N]; int k,b[N]; int main(){ scanf("%d%d%d",&n,&m,&q); _____(1)______; for(i=1;i<=n;i++){ scanf("%d",&a[i]); for(j=m;j>=a[i];j--) ______(2)______; } while(q--){ for(i=0;i<=m;i++) _____(3)_______; scanf("%d",&k); for(i=1;i<=k;i++){ scanf("%d",&b[i]); for(j=a[b[i]];j<=m;j++) _____(4)______; } ans=0; for(i=0;i<=m;i++) ans=_____(5)________; printf("%d\n",ans); } return 0; }
