本文最后更新于:2025年11月3日 下午
                  
                
              
            
            
              
                
                部分和问题
给定整数a1,a2…,an,判断是否可以从中选出若干数,使他们的和恰好为k
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
   | #include<iostream> #include<cstdio>
  using namespace std;
  const int maxn=20 + 5;
  int a[maxn],n,k;
  bool dfs(int i,int sum) {     if(i==n)    return sum == k;     if(dfs(i+1, sum))   return true;     if(dfs(i+1, sum+a[i]))  return true;     return false; }
  int main(){     cin>>n;     for(int i=0;i<n;i++)     {         cin>>a[i];     }     cin>>k;     if(dfs(0,0))    cout<<"Yes"<<endl;     else cout<<"No"<<endl;     return 0; }
 
  | 
 
Lake Counting(POJ2386)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
   | #include<iostream> #include<cstdio>
  using namespace std;
  const int maxn = 100 + 5;
  int N,M; char f[maxn][maxn];
  void dfs(int x, int y) {     f[x][y]='.';     for(int dx=-1;dx<=1;dx++)         for(int dy=-1;dy<=1;dy++)         {             int nx=x+dx, ny=y+dy;             if(0 <= nx && nx < N && 0<=ny && ny< M && f[nx][ny]=='W')                 dfs(nx,ny);         }     return; }
  void solve() {     int res=0;     for(int i=0;i<N;i++)     {         for(int j=0;j<M;j++)         {             if(f[i][j]=='W')             {                 dfs(i, j);                 res++;             }         }     }     cout<<res<<endl; }
  int main(){     cin>>N>>M;     for(int i=0;i<N;i++)         for(int j=0;j<M;j++)             cin>>f[i][j];     solve();     return 1; }
 
  |