首页 > 代码库 > HDU 1709 The Balance
HDU 1709 The Balance
题目:给出一定(n)数量的砝码,每个砝码重a1,a2,a3。。。an,
问题:求出【1~sum】中(sum为各砝码总和)不能被称出的重量;
问题关键:天平两边都可以放砝码,
放在同一端:a[j+k]+=a[j]
不同端a[abs(j-k)]+=a[j]
假设原来的砝码都放在右端,则可以把新加的砝码放在左端,得到新重量,此时a[abs(j-k)]+=a[j]。
#include<bits/stdc++.h>using namespace std;const int maxn = 110;int s[maxn],s1[maxn*maxn],s2[maxn*maxn];void init(){ memset(s1,0,sizeof(s1)); memset(s2,0,sizeof(s2));}int main (){ int n; while (~scanf("%d",&n)) { init(); int sum =0; for(int i=1;i<=n;i++) { scanf("%d",&s[i]); sum+=s[i]; } s1[0] = s1[s[1]] =1; for(int i=2;i<=n;i++) { for(int j=0;j<=sum;j++) { for(int k=0;k<=s[i];k+=s[i]) { s2[j+k] += s1[j]; s2[abs(j-k)] += s1[j]; } } for(int j=0;j<=sum;j++) { s1[j] = s2[j]; s2[j] = 0; } } int num =0,cnt=0; for(int i=0;i<=sum;i++) if(s1[i]==0) num++; if(num == 0) printf("0\n"); else{ printf("%d\n",num); for(int i=0;i<=sum;i++) { if(s1[i]==0) { if(cnt) printf(" %d",i); else//cnt =0 { printf("%d",i); cnt=1; } } } puts(""); } }}
HDU 1709 The Balance
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。