ZR#1005

ZR#1005

解法:

题解给了一个建图跑最短路的做法,但好像没有必要,因为 $ m $ 没有用,所以直接上完全背包就行了。

CODE:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<bitset>

using namespace std;

#define LL long long
#define N 2010
#define rep(i, a, n)for (int i = a; i < n; i++)
#define per(i, a, n)for (int i = n-1; i >= a; i--)
 
bitset<N> nst, st, zero; 
int n,k,x,vis[N],a[N],m,res; 

int main() {
	scanf("%d%d%d",&k,&n,&res); 
	rep(i, 0, k) {
		scanf("%d",&x); 
		vis[x] = 1; 
	}
	m = 0; 
	rep(i, 0, 1001) {
        if (vis[i])a[m++] = i - n; 
    }
	st[1000] = 1; 
	rep(i, 1, 1001) {
		nst = zero; 
		rep(j, 0, m) {
            if (a[j] > 0) nst |= (st << a[j]); 
            else nst |= (st >> ( - a[j])); 
        }
		st = nst; 
		if(st[1000] == 1) {
			printf("%d
", i); 
            //system("pause");
			return 0; 
		}
	}
	puts("-1"); 
    //system("pause");
    return 0;
}
原文地址:https://www.cnblogs.com/Repulser/p/11709751.html