hdu5616 暴力枚舉
阿新 • • 發佈:2017-08-25
sin mes 清空 iter 三種 行處理 -- main clu
2017-08-25 20:08:54
writer:pprp
題目簡述:
? HDU 5616
? n個砝碼,可以放在天平左右兩側或不放
? m次詢問,每次詢問是否可以測出給定重量
? 1 ≤ n ≤ 20
? 1 ≤ m ≤ 100
這道題采用枚舉的思路的話實現起來還是有點困難的,
要實現的功能是對每個砝碼進行處理,加到左邊, 加到右邊,或者是不加
看了大神的代碼,感覺很巧妙,
設置了兩個標記數組
vis1[2005], vis2[2005]
一個vis1用來記錄當前已經可以實現的重量
另一個vis2用來作為中間量,記錄處理之後的值
通過這個給我一個處理想這樣的題的一個思路吧
代碼如下:
/* theme:hdu5616 writer:pprp declare:暴力枚舉 date:2017/8/25*/ #include <bits/stdc++.h> using namespace std; const int maxn = 2005; int w[maxn]; bool vis1[maxn]; bool vis2[maxn]; int N; int main() { int cas; cin >> cas; while(cas--) { cin >> N; for(int i = 0 ; i < N ; i++) { cin >> w[i]; } memset(vis1,0,sizeof(vis1)); memset(vis2,0,sizeof(vis2)); vis1[0] = 1; for(int i = 0 ; i < N ; i++) { for(int j = 0 ; j <= 2000 ; j++)//頂多20 * 100 個 { //這裏是j不是i if(vis1[j] != 0) //如果已經有元素存在,那麽在新地砝碼加到左邊,加到右邊或者不加,分三種情況 { vis2[j]= true; vis2[abs(j - w[i])] = true; vis2[j + w[i]] = true; } } for(int k = 0 ; k <= 2000 ; k++) //將vis2清空 { vis1[k] = vis2[k]; vis2[k] = 0; } } int m; cin >> m; long long int tmp; for(int i = 0 ; i < m ; i++) { cin >> tmp; if(vis1[tmp] == 0 || tmp < 0 || tmp > 2000) { cout << "NO" << endl; } else { cout << "YES" << endl; } } } return 0; }
hdu5616 暴力枚舉