hdu 1709 The Balance(母函数)
2015-04-18 21:25
351 查看
The Balance
Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6260 Accepted Submission(s): 2580
Problem Description
Now you are asked to measure a dose of medicine with a balance and a number of weights. Certainly it is not always achievable. So you should find out the qualities which cannot be measured from the range [1,S]. S is the total quality
of all the weights.
Input
The input consists of multiple test cases, and each case begins with a single positive integer N (1<=N<=100) on a line by itself indicating the number of weights you have. Followed by N integers Ai (1<=i<=N), indicating the quality
of each weight where 1<=Ai<=100.
Output
For each input set, you should first print a line specifying the number of qualities which cannot be measured. Then print another line which consists all the irrealizable qualities if the number is not zero.
Sample Input
3 1 2 4 3 9 2 1
Sample Output
0 2 4 5
Source
HDU 2007-Spring Programming Contest
题目分析:
首先判断某种情况能不能组成,利用母函数,只不过判断时不再是单纯的相加,而是多了相减的情况,因为天平两边都可以放砝码
#include <iostream> #include <cstring> #include <cstdio> #include <algorithm> #include <vector> #define MAX 107 using namespace std; int n; int b[MAX*MAX]; int c[MAX]; int a[MAX*MAX]; vector<int> v,ans; int main ( ) { while ( ~scanf ( "%d" , &n ) ) { int sum = 0; memset ( c, 0 , sizeof ( c ) ); for ( int i = 1 ; i <= n ; i++ ) { scanf ( "%d" , &b[i] ); c[b[i]]++; sum += b[i]; } v.clear(); for ( int i = 1 ; i <= 100 ; i++ ) if ( c[i] ) v.push_back ( i ); int len = v.size(); memset ( a , 0 , sizeof ( a ) ); for ( int i = 0 ; i <= c[v[0]] ; i++ ) a[v[0]*i] = 1; for ( int i = 1 ; i < len ; i++ ) { memset ( b , 0 , sizeof ( b ) ); for ( int j = 0 ; j <= sum ; j++ ) for ( int k = 0 ; k <= c[v[i]] ; k++ ) if ( a[j] ) { if ( j+k*v[i] <= sum ) b[j+k*v[i]] = 1; if ( j-k*v[i] >= 0 ) b[j-k*v[i]] = 1; if ( k*v[i]-j >= 0 ) b[k*v[i]-j] = 1; } for ( int j = 0 ; j <= sum ; j++ ) a[j] = b[j]; } ans.clear(); for ( int i = 1 ; i <= sum ; i++ ) if ( !a[i] ) ans.push_back ( i ); len = ans.size(); printf ( "%d\n" , len ); if ( len ) { printf ( "%d" , ans[0] ); for ( int i = 1 ; i < len ; i++ ) printf ( " %d" , ans[i] ); puts (""); } } }
相关文章推荐
- HDU 1709 The Balance [母函数]
- hdu 1709 The Balance(母函数)
- 母函数 HDU 1709 The Balance
- HDU1709 The Balance【母函数】
- 组合数学 - 母函数的运用 --- hdu 1709 :The Balance
- HDU 1709 The Balance(母函数)
- 【HDU 1709】【母函数】The Balance【给出n个砝码,以及n个砝码的重量,求出(1~sum)中(sum为各砝码总和)不能被称出的重量】
- HDU 1709 The Balance 母函数
- HDU 1709-The Balance(母函数的应用)
- HDU 1709 The Balance (母函数)
- HDU1709 The Balance,母函数套题
- [母函数]HDU 1709 The Balance
- hdu 1709 The Balance(母函数)
- HDU 1709 The Balance【特殊母函数】
- HDU1709 The Balance(母函数,有限制的)
- HDU1709_HDU 1709 The Balance(母函数/生成函数)
- 【HDU】1709 - The Balance(母函数)
- HDU 1709 The Balance【负次方母函数】
- HDU - 1709 The Balance(母函数)
- HDU-1709-The Balance 母函数