1. 程式人生 > >【RQNOJ 5201】數字組合【DP】

【RQNOJ 5201】數字組合【DP】

題目大意:

思路:

很明顯是01揹包的變形。設f[i]表示和為i時的最大答案,那麼就有狀態轉移方程:

f[i]+=f[ia[j]](i>=a[j])
最終答案為f[m]

程式碼:

#include <cstdio>
using namespace std;

int n,m,f[10001],a[101];

int main()
{
    scanf("%d%d",&n,&m);
    for (int i=1;i<=n;i++)
     scanf("%d"
,&a[i]); f[0]=1; for (int j=1;j<=n;j++) for (int i=m;i>=a[j];i--) //最少度只能從f[i-a[j]]轉移而來,所以只要迴圈到a[j] f[i]+=f[i-a[j]]; printf("%d\n",f[m]); return 0; }