3 1 2 4 3 9 2 1
0 24 5
给出n个砝码,然后问你1-sum那些质量称不出来,
今天就是在刷母函数,复习复习 哈哈
这个我们要多考虑一点 就是砝码可以左右放,也就是多了 tmpp=fabs(j-k*s[i]);tmp[tmpp]+=ans[j]; 然后把减去这种情况想到就好了
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> using namespace std; int s[10005],ans[10005],tmp[10005],cmax; int num[10005],n; int mu() { memset(ans,0,sizeof(ans)); memset(tmp,0,sizeof(tmp)); ans[0]=1; cmax=0; for(int i=1; i<=n; i++) { cmax+=s[i]; for(int j=0; j<=cmax; j++) for(int k=0; k<=1&&k*s[i]+j<=cmax; k++) { int tmpp=fabs(j-k*s[i]); tmp[j+k*s[i]]+=ans[j]; tmp[tmpp]+=ans[j];//注意这里 } memcpy(ans,tmp,sizeof(tmp)); memset(tmp,0,sizeof(tmp)); } return 0; } int main() { while(cin>>n) { if(n==0) break; int sum=0; for(int i=1; i<=n; i++) { scanf("%d",&s[i]); sum+=s[i]; } mu(); int ssum=0; for(int i=1;i<=sum;i++) { if(ans[i]==0) ssum++; } cout<<ssum<<endl; int k=1; if(ssum!=0) { for(int i=1;i<=sum;i++) { if(ans[i]==0&&k<ssum) { cout<<i<<" "; k++; } else if(ans[i]==0) { cout<<i<<endl; break; } } } } return 0; }