【codevs1692】子集和的目标值

这个题开始想了一个诡异的dp,水了80分,然后怎么也没想到如何存下答案……于是我打开了题解,被开启了一扇新世界的大门:用map存dp数组,666666666,社会社会,太强了

#include<iostream>
#include<cstdio>
#include<cmath>
#include<map>
using namespace std;
int n;
long long t,qwq[110],ans=100000000007;
map<int,bool>dp[110];//用map存dp数组,令人吃鲸的操作 
void dfs(int ceng,long long tot)//记忆化搜索 
{
    if(ceng==n+1)
        ans=min(ans,(long long)abs(t-tot));
    else
    {
        if(dp[ceng][tot]||tot-t>ans)//如果选过了或者tot太大 
            return;//直接返回 
        dp[ceng][tot]=1,ans=min(ans,(long long)abs(t-tot));
        dfs(ceng+1,tot),dfs(ceng+1,tot+qwq[ceng]);//选或者不选 
    }
}
int main()
{
    scanf("%d%lld",&n,&t);
    for(int i=1;i<=n;i++)
        scanf("%lld",&qwq[i]);
    dfs(1,0);
    printf("%lld",ans);
}

 

posted @ 2017-10-23 10:49  那一抹落日的橙  阅读(173)  评论(0)    收藏  举报