OJ4008 糖果 各種dp之3

2021-08-14 05:09:16 字數 719 閱讀 2687

就是乙個英雄瞎搞之類為世界作出貢獻,藍後某zz公司免費給他糖,然後由於某些原因他只能拿能整除k數量糖果,然後每個盒子裡有一定數量的糖果,拿了盒子就必須拿完裡面所有的糖果,求他怎麼拿的最多。

5 7

1 2

3 4

5dzx的選擇是2+3+4+5=14,這樣糖果總數是7的倍數,並且是總數最多的選擇。

emmmmmmmmmmmmmmmmmmmmmmm?其實我開始是用揹包做的,但是資料忒大了qaq。所以……

好吧,講正事

我們用f[i][j]表示前i個糖果數量%k餘j時的最大值。藍後我們就可以醬紫做。乙個是選擇這個糖,乙個是不選這個(就是我不要這個了 ╯^╰ )。

動態轉移方程:

f[i][(f[i-1][j]+a[i])%k]=max(f[i][(f[i-1][j]+a[i])%k],f[i-1][j]+a[i])

#include

#include

using

namespace

std;

int n,k,a[10001],m;

int f[1001][1001];

int main()

//以上↑為輸入

for (int i=1;i<=n;i++)

printf("%d",f[n][0]);

//輸出

}