问有多少种方案使得无法装入剩下的任意一个物品
一眼看过去 嘻嘻普通一维背包嘛 记录一个最小的物品然后加上就好
样例一跑 emmmmmm 仔细一看 没那么简单QAQ 是道好题
不能再装即=最小的也装不进去 枚举不在背包中的最小值 然后比它小的肯定都装进去了 比它大的装不进去
好像就没有像清楚过为什么要从后往前或者从前往后扫 后面几天进行清理
#include<iostream> #include<cstdio> #include<cmath> #include<algorithm> using namespace std; #define ll long long #define rg register #define lson o<<1 #define rson o<<1|1 const int N=2000+5,M=200000+5,inf=0x3f3f3f3f,P=19650827; int n,m,T,a[N],sum[N],f[N],mn,ans; template <class t>void rd(t &x){ x=0;int w=0;char ch=0; while(!isdigit(ch)) w|=ch=='-',ch=getchar(); while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar(); x=w?-x:x; } int main(){ freopen("in.txt","r",stdin); rd(T); for(int t=1;t<=T;++t){ memset(f,0,sizeof(f)); rd(n),rd(m),mn=inf,ans=sum[0]=0,f[0]=1; for(int i=1;i<=n;++i) rd(a[i]); sort(a+1,a+n+1); for(int i=1;i<=n;++i) sum[i]=sum[i-1]+a[i]; for(int i=n;i>=1;--i) for(int v=m;v;--v){ if(v-sum[i-1]>=0&&v>m-a[i]) ans+=f[v-sum[i-1]];//加上sum[i-1]的贡献 //比它小的都放进去了 比它大的放不进去 if(v>=a[i]) f[v]+=f[v-a[i]];//统计 } printf("%d %d ",t,ans); } return 0; }