AtCoder Beginner Contest 169 F.Knapsack for All Subsets

AtCoder Beginner Contest 169 F.Knapsack for All Subsets

题目链接
AtCoder Beginner Contest 169 F.Knapsack for All Subsets_第1张图片
又是魔性 d p dp dp,大佬总是两百字节解决,膜了
d p [ i ] dp[i] dp[i] 表示结果,对每个 a , i ∈ [ s , 0 ] a,i∈[s,0] a,i[s,0],可以得到状态转移方程:
d p [ i + a ] = d p [ i + a ] + d p [ i ] dp[i+a]=dp[i+a]+dp[i] dp[i+a]=dp[i+a]+dp[i]
d p [ i ] = d p [ i ] ∗ 2 dp[i]=dp[i]*2 dp[i]=dp[i]2
上面很好理解,下面我理解为集合内多了一个数 a a a,所以总情况要乘 2
d p dp dp 总是那么奇妙
AC代码如下:

#include
using namespace std;
typedef long long ll;
const ll mod=998244353;
main(){
   ll n,s,a,i,j,dp[6005]={1};
   cin>>n>>s;
   for(i=0;i<n;i++){
        cin>>a;
        for(j=s;j>=0;j--){
            dp[j+a]=(dp[j+a]+dp[j])%mod;
            dp[j]=dp[j]*2%mod;
        }
   }
   cout<<dp[s];
}

你可能感兴趣的:(动态规划,AtCoder)