问题 4180 --背包问题

4180: 背包问题★★★

时间限制: 1 Sec  内存限制: 128 MB
提交: 107  解决: 50
[提交][状态][命题人:]

题目描述

给定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;
}

输入

输出

提示

来源

[提交][状态]