hdu_5616_Jam's balance(暴力枚举子集||母函数)

题目连接:hdu_5616_Jam's balance

题意:

给你一些砝码,和一些要被称出的重量,如果这些砝码能称出来输出YES,否则输出NO

题解:我们想想,这题求组合方式,我们这里可以直接用母函数艹过去,这里我写的枚举子集的方式,其实就是母函数的形式

 1 #include<cstdio>
 2 #define F(i,a,b) for(int i=a;i<=b;i++)
 3 int abs(int a){return a<0?-a:a;}
 4 int a[30],dp[25][2511];
 5 int main(){
 6     int t,n,m,sum,x;
 7     scanf("%d",&t);
 8     while(t--){
 9         scanf("%d",&n),sum=0;
10         F(i,1,n)scanf("%d",a+i),sum+=a[i];
11         F(i,0,n)F(j,0,sum)dp[i][j]=0;
12         dp[1][a[1]]=1;
13         F(i,1,n)dp[i][0]=1;
14         F(i,2,n)F(j,0,sum){
15             dp[i][j]|=dp[i-1][j];
16             dp[i][j+a[i]]|=dp[i-1][j];
17             dp[i][abs(j-a[i])]|=dp[i-1][j];
18         }
19         scanf("%d",&m);
20         while(m--)scanf("%d",&x),dp[n][x]?puts("YES"):puts("NO");
21     }
22     return 0;
23 }
View Code

 



 

posted @ 2016-07-16 23:30  bin_gege  阅读(116)  评论(0编辑  收藏  举报