等和子数组最小和
题目描述
给定一个数组nums,将元素分为若干个组,使得每组和相等,求出满足条件的所有分组中,组内元素和的最小值。
输入描述
第一行输入m
接着输入m个数,表示此数组nums数据范围:1<=m<=50,1<=nums[i]<=50
输出描述
最小拆分数组和
用例
这是一道非常经典的 划分为K个相等子集问题
做法是回溯,位运算的做法我不太会,但是这种题回溯加剪枝特别好用,下面代码给nums排个降序可能会更快点,我把这个给忘了
leetcoode
698. 划分为k个相等的子集
473 火柴拼正方形
699. 完成所有工作的最短时间
700. 公平分发饼干
华为od2023 MVP争夺战
#include <iostream>
#include <string>
#include<vector>
#include <unordered_map>
#include <stdio.h>
#include <algorithm>
#include <unordered_map>
#include<queue>
#include<cmath>
#include <sstream>
#include <functional>
#include <limits.h>
using namespace std;
vector<int> nums;
int sum;
bool check(int i, vector<int> box){
if(i==nums.size()){
return true;
}
for(int j = 0 ; j<box.size();j++){
if(j!=0&&box[j-1]==box[j]){
continue;
}
if(box[j]>=nums[i]){
box[j] = box[j]-nums[i];
if(check(i+1,box)) return true;
box[j] = box[j] + nums[i];
}
}
return false;
}
int main(){
int m;
cin>>m;
nums.resize(m);
int maxt = 0;
sum =0 ;
for(int i=0;i<m;i++) {
cin>>nums[i];
sum += nums[i];
maxt = max(maxt,nums[i]);
}
int res = sum;
int i = sum;
for(i = maxt ; i<= sum; i++){
if(sum%i!=0){
continue;
}else{
vector<int> box(sum/i,i);
res = check(0,box);
if(res){
break;
}
}
}
cout<<i<<endl;
}