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可读性 差点=,=
浙公网安备 33010602011771号