1. 程式人生 > >hdu5616 暴力枚舉

hdu5616 暴力枚舉

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 暴力枚舉