Mr Zz

导航

HDU The Balance

题目意思是  给你几个物品(应该每个物品都不一样) 求 不可以称量出各种重量   相当于砝码 称东西 注意可以是减法不一定 都是相加

只要在母函数模板里加个大数减小数就行

输入

3

1 2 4

3

9 2 1

#include<iostream>
#include<cstring>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
#define MAX 10010
int c1[MAX];
int c2[MAX];
void work(int m,int mm) {
for(int i=0;i<=m;i++) {
for(int j=0;j<=mm;j+=mm){
c2[i+j] += c1[i];
if(c1[i]!=0) {
if(i>j)
c2[i-j] += c1[i];
else if(j>i)
c2[j-i] += c1[i];
}
}
}
for(int i=0;i<=m+mm;i++) {
c1[i] = c2[i];
c2[i] = 0;
}
}
int main(){
int n;
freopen("t.txt","r",stdin);
while(scanf("%d",&n)!=EOF) {
memset(c1,0,MAX);
memset(c2,0,MAX);
int sum = 0,num = 0;
c1[0] = 1;
for(int i=0;i<n;i++) {
int w;
scanf("%d",&w);
sum+=w;
if(i==0) {
c1[w] = 1;
num += w;
}
else {
work(num,w);
num+=w;
}
}
int counts = 0;
for(int i=1;i<=sum;i++) {
if(c1[i]==0)
counts++;
}
printf("%d\n",counts);
if(counts) {
for(int i=1;i<=sum;i++) {
if(c1[i]==0) {
printf("%d",i);
counts--;
if(counts)
printf(" ");
else {
printf("\n");
}
}
}
}
}
return 0;
}

能ac可读性 差点=,=

posted on 2011-10-14 14:42  Mr Zz  阅读(199)  评论(0)    收藏  举报