这题就是问给你各种重量砝码各一个 问能称多重的东西 这里可以两面同时放砝码 所以第二个样例出现4 5 两种情况
这题用DP 母函数都可以 只不过要考虑两个天平都有砝码也就是相减的情况 我是用DP做的 所以开了一个滚动数组
看代码吧
#include <iostream> #include<cstdio> #include<cstring> using namespace std; int get(int x) { return x>=0?x:-x; } bool dp[10005][2]; int ans[10005]; int main() { int n,yl[105],num,sum; while(~scanf("%d",&n)) { sum=0; memset(dp,0,sizeof(dp)); dp[0][0]=1; int g1=1,g2=0; for(int i=0; i<n; i++) { g1=!g1,g2=!g2; scanf("%d",&yl[i]); for(int j=0; j<=sum; j++) if(dp[j][g1]) dp[j][g2]=1,dp[get(j+yl[i])][g2]=1,dp[get(j-yl[i])][g2]=1; for(int j=0; j<=sum; j++) dp[j][g1]=0; sum+=yl[i]; } num=0; for(int i=1; i<=sum; i++) if(!dp[i][g2]) ans[num]=i,num++; printf("%d\n",num); if(num) for(int i=0; i<num; i++) if(i<num-1) printf("%d ",ans[i]); else printf("%d\n",ans[i]); } return 0; }