1. 程式人生 > 其它 >[Acwing藍橋杯DP] 1047. 糖果

[Acwing藍橋杯DP] 1047. 糖果

題目連結:1047. 糖果 - AcWing題庫

題目大意:有n堆糖果 每堆糖果有一定的數量不為0 求選n堆中任意堆糖果總和的最大值,且最大值是k的倍數 每堆糖果只能用一次。

資料範圍:1<=N<=100

                  1<=K<=100

分析:這是個經典的揹包問題

閆氏DP分析法:

集合:f [ i ][ j ]  表示 : 在前n堆中選總和除以k的餘數為j

屬性:最大值

方式劃分 在前n堆中(1)不選第n堆,(2)選第n堆

狀態轉移: f [ i ][ j ]=max( f [ i - 1][ j ] ,f [ i - 1][ (( j - w)%k + k)%k//保證為正數

] + w ); //w是第i堆的糖果數量

程式碼:

#include <bits/stdc++.h>
using namespace std;
const int N=110;
int f[N][N];
int n,m;
int main()
{
    //初始化
    memset(f,-0x3f,sizeof f);
    f[0][0]=0;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        int w;
        cin>>w;
        for(int j=0;j<m;j++)
        {
            f[i][j]
=max(f[i-1][j],f[i-1][((j-w)%m+m)%m]+w); } } cout<<f[n][0]<<endl; return 0; }

end!!!