就是乙個英雄瞎搞之類為世界作出貢獻,藍後某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]);
//輸出
}