找了几道背包做了一下。这道题是让求出使得没有被装进背包的物品装不进背包的方案数。。。
我们把物品体积排下序。可以枚举装不进背包的最小的物品。那么这意味着比这个物品小的一定会装进背包,比这个物品大的就是01背包的模型了。那么i为最小进不了物品时,对应的方案数就是:以比i大的物品做一个容积为(背包容积-sum(<i))的01背包,使得剩余的容积不足Vi的方案数。
//By YY_More #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int N,M,t,sum,ans,a[1001],F[1001]; int main(){ scanf("%d",&t); int num=0; while (++num<=t){ printf("%d ",num); scanf("%d%d",&N,&M); sum=0; for (int i=1;i<=N;i++){ scanf("%d",&a[i]); sum+=a[i]; } sort(a+1,a+N+1); if (a[1]>M){ printf("%d\n",0); continue; } ans=0; memset(F,0,sizeof(F));F[0]=1; for (int i=N;i>0;i--){ sum-=a[i]; for (int v=max(M-sum-a[i]+1,0);v<=M-sum;v++) ans+=F[v]; for (int v=M;v>=a[i];v--) F[v]+=F[v-a[i]]; } printf("%d\n",ans); } return 0; }