1. 程式人生 > >2017浙江工業大學-校賽決賽 小M和天平

2017浙江工業大學-校賽決賽 小M和天平

++ tor mes bsp %d tac ont i++ 工業

Description

小M想知道某件物品的重量,但是擺在他面前的只有一個天平(沒有遊標)和一堆石子,石子可以放左邊也可以放右邊。他現在知道每個石子的重量。問能不能根據上述條件,能不能測出所問的重量。

Input

第一行T(1≤T≤100),表示T組數據。
接下來T組數據:
接下來第一行一個數N,表示石子個數。(1≤N≤100)
接下來第二行N個數,表示石子的重量。(1≤w_i≤100)
接下來第三行一個數M,表示詢問個數。(1≤M≤100)
接下來M行每行一個數k,表示一個詢問。

Output

對於每組數據,輸出"YES"或者"NO"

Sample Input

1
2
1  4
3
2
4
5

Sample Output

NO
YES
YES
解法:
dp[i][j] 表示計算到第i個砝碼,能計算j重量
首先dp[i][0]=1
5 2
1 第一個數字為5時,我們可以計算5的質量 dp[1][5]=dp[1-1][0+5]=1
2 第二個數字為2時,我們知道dp[2][7]=dp[2-1][7-2]=1或者是dp[2][3]=dp[2-1][5-2]=1 (當dp[1][5]==1時)
那麽有
dp[i-1][j]==1時 dp[i][j]=1 dp[i][j+a[i]]=1 dp[i][abs(j-a[i])]=1
 1 #include<cstdio>
 2 #include<algorithm>
 3
#include<cstring> 4 #include<map> 5 #include<vector> 6 #include<iostream> 7 #include<sstream> 8 #include<cmath> 9 #include<string> 10 #include<set> 11 #include<list> 12 #include<stack> 13 #include<queue> 14 using namespace std;
15 int dp[200][100*100+10]; 16 int main() 17 { 18 int t; 19 scanf("%d",&t); 20 while(t--){ 21 int sum=0; 22 int a[200]; 23 int n; 24 scanf("%d",&n); 25 memset(dp,0,sizeof(dp)); 26 for(int i=1;i<=n;i++){ 27 scanf("%d",&a[i]); 28 sum+=a[i]; 29 } 30 for(int i=0;i<=n;i++){ 31 dp[i][0]=1; 32 } 33 for(int i=1;i<=n;i++){ 34 for(int j=sum;j>=0;j--){ 35 if(dp[i-1][j]){ 36 dp[i][j]=1; 37 dp[i][abs(j-a[i])]=1; 38 dp[i][j+a[i]]=1; 39 } 40 } 41 } 42 int m; 43 scanf("%d",&m); 44 while(m--){ 45 long long p; 46 scanf("%lld",&p); 47 if(dp[n][p]){ 48 puts("YES"); 49 }else{ 50 puts("NO"); 51 } 52 } 53 } 54 return 0; 55 }

2017浙江工業大學-校賽決賽 小M和天平