--- title: "糖果" created: 2025-11-28 tags: - 算法 --- # 糖果 ## 题目 [糖果](https://www.acwing.com/problem/content/description/1049/) ![[image-bfd34f5b.png]] ## 思路分析 N件产品中 任选若干件 (每件都包含数量不同的糖果) N个物品 每个物品包含糖果数是他的价值w[i] 希望w[i] 最大 且 为K的整数倍 物品不可拆分 只能选与不选(01背包) 体积无限制 ## 代码实现 dfs (tle) ```cpp #include using namespace std; #define endl '\n' using ll = long long; using ull = unsigned long long; using PII = pair; using Pll = pair; int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; const int inf = 0x3f3f3f3f; const int N=110; int w[N]; int n,k; int res=0; void dfs(int u,int sum){ if(u>n){ if(sum%k==0){ res=max(res,sum); } return; } dfs(u+1,sum+w[u]); dfs(u+1,sum); } int main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n>>k; for(int i=1;i<=n;i++){ cin>>w[i]; } dfs(1,0); cout< using namespace std; #define endl '\n' using ll = long long; using ull = unsigned long long; using PII = pair; using Pll = pair; int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; const int inf = 0x3f3f3f3f; const int N=110; int w[N]; int n,k; int res=0; int dp[N][N]; //前i件物品中选 得到价值之和mod k == j时的最大价值和 int main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n>>k; for(int i=1;i<=n;i++){ cin>>w[i]; } for(int j=0;j=0){ int mod = (j+w[i])%k; dp[i][mod] = max(dp[i][mod],dp[i-1][j]+w[i]); } } } cout< using namespace std; #define endl '\n' using ll = long long; using ull = unsigned long long; using PII = pair; using Pll = pair; int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1}; const int inf = 0x3f3f3f3f; const int N=110; int w[N]; int n,k; int res=0; int dp[N][N]; //前i件物品中选 得到价值之和mod k == j时的最大价值和 int main(){ ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); cin>>n>>k; for(int i=1;i<=n;i++){ cin>>w[i]; } for(int j=0;j