Description
小M想知道某件物品的重量,但是摆在他面前的只有一个天平(没有游标)和一堆石子,
石子可以放左边也可以放右边。他现在知道每个石子的重量。问能不能根据上述条件,能不能测出所问的重量。
Input
多组输入,对于每组测试数据
第一行一个数 N N,表示石子个数。 (1≤N≤100) (1≤N≤100)
接下来第二行 N N个数,表示石子的重量。 (1≤Wi≤100) (1≤Wi≤100)
接下来第三行一个数 M M,表示询问个数。 (1≤M≤1000) (1≤M≤1000)
接下来M行每行一个数 k(1≤k≤109) k(1≤k≤109),表示一个询问。
第一行一个数 N N,表示石子个数。 (1≤N≤100) (1≤N≤100)
接下来第二行 N N个数,表示石子的重量。 (1≤Wi≤100) (1≤Wi≤100)
接下来第三行一个数 M M,表示询问个数。 (1≤M≤1000) (1≤M≤1000)
接下来M行每行一个数 k(1≤k≤109) k(1≤k≤109),表示一个询问。
Output
对于每组数据,输出"YES"或者"NO"
Sample Input
2
1 4
3
2
4
5
Sample Output
NO YESYES
思路:傻逼dp题,比赛的时候我队友去写结果卡了,我没去想,现在来写发现就是道傻逼dp
状态为dp[i][j] i为前i个物品,j为相对重量,dp值为是否能到达这个状态
ac代码:
#include<cstdio> #include<algorithm> #include<cstring> #include<map> #include<vector> #include<iostream> #include<sstream> #include<cmath> #include<string> #include<set> #include<list> #include<stack> #include<queue> using namespace std; int dp[100+5][10000+5]; int a[100+5]; int vis[10000+5]; int n,m; int main() { while(~scanf("%d",&n)) { for(int i = 1;i <= n; i++) { scanf("%d",&a[i]); } memset(vis,0,sizeof(vis)); memset(dp,0,sizeof(dp)); for(int i = 0 ;i<=n;i++) { dp[i][0]=1; } for(int i = 1;i <= n; i++) { for(int j = 10000; j >= 0;j--) { if(dp[i-1][j]) { dp[i][abs(a[i]-j)] = 1; dp[i][a[i]+j] = 1; dp[i][j] = 1; } } } scanf("%d",&m); for(int i = 0 ;i < m;i++) { long long x; scanf("%lld",&x); if(x>10000) { puts("NO"); } else if(dp[n][x]) { puts("YES"); } else puts("NO"); } } return 0; }