[Acwing藍橋杯DP] 1047. 糖果
阿新 • • 發佈:2022-03-31
題目連結: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!!!