【2017 Multi-University Training Contest

Link:http://acm.hdu.edu.cn/showproblem.php?pid=6140

Description

等价于告诉你有n个物品,每个物品的价值为-a[i]或a[i],或者这个物品可以看成两个物品一个为a[i]另外一个为-a[i];
问你能不能达到物品价值k

Solution

爆搜。
加个看起来不是很有用的剪枝就能过.
(记录某个位置后面所有的整数的和)
大数据的背包好像都能这样做。
(这题数据比较水??)
【另解】:
题目描述的上面有说a1=1,b1=’N’
也就是说-1..1都可以得到;
假设当前[L..R]都可以得到(L为负,R为正)
又来了一个数字x
假设x要加上,且x<=R,
则L..R+x都可以得到
假设x要减掉,且x<=|L|
则L-x..R都可以得到;
如果可加可减,且x<=min(|L|,R);
则L-x..R+x都可以得到;
上面那个很变态的不等式使得这些如果都成立了。。


NumberOf WA

1

Reviw

大数据背包用dfs

Code

#include <bits/stdc++.h>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define rep1(i,a,b) for (int i = a;i <= b;i++)
#define rep2(i,a,b) for (int i = a;i >= b;i--)
#define mp make_pair
#define pb push_back
#define fi first
#define se second
#define ms(x,y) memset(x,y,sizeof x)
#define ri(x) scanf("%d",&x)
#define rl(x) scanf("%lld",&x)
#define rs(x) scanf("%s",x+1)
#define oi(x) printf("%d",x)
#define ol(x) printf("%lld",x)
#define oc putchar(' ')
#define os(x) printf(x)
#define all(x) x.begin(),x.end()
#define Open() freopen("F:\rush.txt","r",stdin)
#define Close() ios::sync_with_stdio(0)

typedef pair<int,int> pii;
typedef pair<LL,LL> pll;

const int dx[9] = {0,1,-1,0,0,-1,-1,1,1};
const int dy[9] = {0,0,0,-1,1,-1,1,-1,1};
const double pi = acos(-1.0);
const int N = 2e3;
const int INF = 1e6+10;

int n,k,tot;
int w[N+10],a[N+10],ma[N+10],mi[N+10];
char s[N+10][3];

bool dfs(int now,int sum){
    if (sum == k) return true;
    if (now > n) return false;
    if (sum + ma[now] < k) return false;
    if (sum + mi[now] > k) return false;
    if (dfs(now+1,sum+w[now])) return true;
    if (dfs(now+1,sum)) return true;
    return false;
}

int main(){
    //Open();
    //Close();
    int T;
    ri(T);
    while (T--){
        ri(n),ri(k);
        rep1(i,1,n) ri(a[i]);
        rep1(i,1,n) rs(s[i]);
        tot = 0;
        rep1(i,1,n){
            if (a[i]==0) continue;
            if (s[i][1]=='N'){
                w[++tot] = a[i];
                w[++tot] = -a[i];
            }else
                if (s[i][1]=='L')
                    w[++tot] = a[i];
                else
                    w[++tot] = -a[i];
        }
        n = tot;
        ma[n+1] = mi[n+1] = 0;
        rep2(i,n,1){
            ma[i] = ma[i+1],mi[i] = mi[i+1];
            if (w[i]>0)
                ma[i] += w[i];
            if (w[i]<0)
                mi[i] += w[i];
        }
        if (dfs(1,0))
            puts("yes");
        else
            puts("no");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/AWCXV/p/7626109.html