HDU 1709

MB,一开始就想到是不是只要加上一个不选择砝码的情况,但一直没动手做,因为看了看网上了,觉得总有点复杂,认为自己想错了。。。。

相信自己

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define N 101
using namespace std;

int c1[N*N],c2[N*N];
int Fa[N],ans[N*N],ap;

int main(){
	int n,sum;
	while(scanf("%d",&n)!=EOF){
		sum=0;
		for(int i=1;i<=n;i++){
			scanf("%d",&Fa[i]);
			sum+=Fa[i];
		}
		sort(Fa+1,Fa+n+1);
		memset(c1,0,sizeof(c1));
		memset(c2,0,sizeof(c2));
		c1[0]=c1[Fa[1]]=1;
		for(int i=2;i<=n;i++){
			for(int j=0;j<=sum;j++){
				for(int k=0;k<=Fa[i];k+=Fa[i])
				c2[k+j]+=c1[j],c2[abs(k-j)]+=c1[j];
			}
			for(int j=0;j<=sum;j++)
			c1[j]=c2[j],c2[j]=0;
		}
		ap=0;
		for(int j=1;j<=sum;j++)
		if(c1[j]==0){
			ans[ap++]=j;
		}
		printf("%d\n",ap);
		if(ap) printf("%d",ans[0]);
		for(int i=1;i<ap;i++)
		printf(" %d",ans[i]);
		if(ap) printf("\n");
	}
	return 0;
}

  

时间: 2024-07-31 14:32:10

HDU 1709的相关文章

Hdu 1709 The Balance

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1709 题意: 给N个整数,每个数只能使用一次.将他们组合起来,最后看在1~sum(a[1]..a[N])这些数里有多少数是这N个数组合不出来的. 先输出这些数的个数,再将这些数输出来.如果个数是0,那么不需要输出数. 案例分析: input: 3 1 2 4 output: 0 -->1(||4-1-2) , 2(||4-2) , 1+2(||4-1) , 4  , 1+4 , 2+4 , 1+2+

*HDU 1709 母函数

The Balance Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 7677    Accepted Submission(s): 3187 Problem Description Now you are asked to measure a dose of medicine with a balance and a number o

HDU 1709 母函数天平问题 可出现减法的情况 The Balance

The Balance Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 6652    Accepted Submission(s): 2730 Problem Description Now you are asked to measure a dose of medicine with a balance and a number o

hdu 1709 The Balance(母函数)

题意: 有一个天平.有N个砝码.重量分别是A1...AN. 问重量[1..S]中有多少种重量是无法利用这个天平和这些砝码称出来的. S是N个砝码的重量总和. 思路: 对于每一个砝码来说,有三种:不放,放左盘,放右盘. 额,,母函数和DP其实核心一样,,,, 看代码,, 代码: int n; int aa[105]; bool a[10005], b[10005]; int temp[10005]; int main(){ while(scanf("%d",&n)!=EOF){

HDU 1709 The Balance( DP )

The Balance Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5956    Accepted Submission(s): 2427 Problem Description Now you are asked to measure a dose of medicine with a balance and a number o

组合数学 - 母函数的运用 --- hdu 1709 :The Balance

The Balance Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 5706    Accepted Submission(s): 2311 Problem Description Now you are asked to measure a dose of medicine with a balance and a number o

hdu 1709 求天平不能称重的重量 动态规划

给定一个天平和n个砝码,每个砝码都有一个重量,求出从1到这些砝码的总和之间不能被天平表示的重量.天平可以两端放砝码. 动态规划做法,看网上都是母函数,真心不懂.. dp[i]如果是0表示这些砝码不能称重i重量,如果是1表示能称重i重量. 对于每个砝码,假设当前砝码重量是b[i],那么j从最大值开始,减小到b[i], 如果存在一个dp[j-b[i]]为1,说明当前的j能被组成. j逆着循环的原因是由于每个砝码只有 一个,类似于01背包与完全背包的样子, 如果正向循环会导致每个物品可能使用多次,逆向

hdu 1709 母函数变形

#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 10010 int c1[MAX], c2[MAX], num[110]; /* 题目大意: 给你n种砝码,从1到n中砝码的重量和其中不能称出多少种重量,输出不能称出的总数和类别*/ int main() { int n; while( scanf("%d", &n)!=EOF ) { memset(n

母函数专题

1.Hdu 2082 找单词 题意:单词A-Z具有1-26的价值,现有字母A-Z的个数num[i],求问在不超过价值为五十的情况下,有多少种字母的组合数. 思路:用指数代表价值,价值又为数组的下标:用系数代表组成该价值的方案数,方案数为数组中存的值. 1 #include<iostream> 2 #include<memory.h> 3 using namespace std; 4 int re[55]; 5 int p1[55]; 6 int p2[55]; 7 int xx[2