【发布时间】:2021-03-14 15:01:54
【问题描述】:
我一直在尝试解决一个问题,即确定将 N 个物品分发给三个人的方法的数量。如果第一个人得到的物品的总重量可以被 3 整除,第二个人得到的物品的重量可以被 5 整除,最后一个人得到的物品的总重量可以被 7 整除,那么分配将被认为是最好的。每个人得到的物品不应该是0。
第一个输入 N 被认为是项目数,第二行输入表示 N 个整数,表示项目的权重。第 i 个整数 a[i] 表示第 i 个项目的权重。有这样的限制,
3≤ N ≤12
1≤ a[i] ≤10^10
sample input 1:
6
2 3 5 7 9 13
sample output 1:
6
我尝试了一种解决问题的方法,但无法弄清楚如何更好地解决问题,以便第一人、第二人和第三人收到的物品的重量分别被 3、5 和 7 整除.我尝试让一个人在三个人中获得最大数量的物品,每个人至少获得一件物品,但无法弄清楚每个人获得的物品总重量可以被 3 整除的“最佳”解决方案, 5 和 7 分别。 您能否建议 DP 中的解决方案来解决所有测试用例中的问题?
这是我在三个人之间进行简单分配的解决方案。 TIA。
#include<bits/stdc++.h>
using namespace std;
int countWays(int N)
{
int ans = ((N-1)*(N-2))/2;
//storing the number of distribution that is not possible
int s = 0;
for(int i=2; i<=N-3; i++){
for(int j=1; j<i; j++){
//possibilities of 2 persons receiving the maximum
if (N == 2 * i + j)
s++;
}
}
if(N%3 == 0)
s = 3*s+1;
else
s = 3*s;
//final ways to distribute
return ans - s;
}
int main()
{
int n, N=0;
cin >> n;
if(n<3 && n>12)
return 0;
vector<int> a(n);
for(int i=0; i<n; i++){
cin>>a[i];
N += a[i];
}
cout<<countWays(N);
return 0;
}
【问题讨论】:
标签: c++ algorithm c++11 dynamic-programming