魔术球问题
从前往后能放就放,求严谨贪心证明!!!
#include<bits/stdc++.h> using namespace std; map<int,int>spr; int n,ans; int top[100],cnt; vector<int>p[100]; void dfs(int pos){ ans=max(ans,pos); for(int i=1;i<=cnt;i++) if(spr[top[i]+pos]){ top[i]=pos; p[i].push_back(pos); dfs(pos+1); return; } if(cnt>=n)return; top[++cnt]=pos; p[cnt].push_back(pos); dfs(pos+1); } int main(){ cin>>n; for(int i=1;i<=10000;i++) spr[i*i]=1; dfs(1); printf("%d\n",ans-1); for(int i=1;i<=n;i++){ for(int j=0;j<p[i].size();j++) printf("%d ",p[i][j]); puts(""); } return 0; }
深深地感到自己的弱小。