【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); }

浙公网安备 33010602011771号