这个DP题不太懂,有大佬可以解释一下吗?
知道是个01背包DP,但是转移方程和下面的过程不太懂(本人是新学DP的蒟蒻,望大佬能详细解答,谢谢)
#include<bits/stdc++.h>
using namespace std;
const int maxn = 114514;
int n,m,num;
int s[4];
int a[maxn],dp[maxn];
signed main()
{
ios::sync_with_stdio(0);
for(int i = 1;i <= 4; i ++)cin>>s[i];
for(int i = 1;i <= 4 ;i ++)
{
num = 0;
for(int j = 1;j <= s[i] ;j ++)
{
cin>>a[j];
num += a[j];
}
for(int j = 1;j <= s[i];j ++)
{
for(int k = num / 2;k >= a[j] ;k --)
{
dp[k] = max(dp[k],dp[k - a[j]] + a[j]);
}
}
m += num - dp[num /2];
for(int j = 1;j <= num/2; j ++)dp[j] = 0;
}
cout<<m;
}
顺便问一下,CSPJ到了,应该学点啥呢?
感谢感谢!!!!