Balanced Partition of Array

本文介绍了一种使用动态规划解决将数组分成两部分并使这两部分的和之差最小的问题的方法。通过构建布尔型动态规划表格,实现了寻找能使两部分和最接近的子序列的目标。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Given an array which contains random positive integers, divide the array into two parts which has the smallest diff sum, return the smallest diff sum.

This problem is solvable using dynamic programming. Using s(i, j) to stands for "there is a sum(1, i) to j" Thus, s(i, j) = s(i-1, j) || s(i, j - nums[i]);

This goes back to "coins exchange or backpacking problem again". To get the minimum difference, we can check whether there is any subsequence equals to (Sum(i, n) / 2 ... 0)

#include "header.h"
using namespace std;

// partition an array into two parts so that the two parts has mini differnce of sum.
// the two array length might not be even.

int miniDiff(vector<int>& nums) {
  int sum = 0;
  for(int i = 0; i < nums.size(); ++i) {
    sum += nums[i];
  }
  int size = nums.size();
  vector< vector<bool> > dp(size + 1, vector<bool>(sum + 1, false));
  for(int i = 0; i <= size; ++i) {
    dp[i][0] = true;
  }
  for(int i = 1; i <= sum; ++i) {
    dp[0][i] = false;
  }

  for(int i = 1; i <= size; ++i) {
    for(int j = 1; j <= sum; ++j) {
      if(j - nums[i - 1] >= 0) {
        dp[i][j] = (dp[i - 1][j] || dp[i][j - nums[i - 1]]);
      } else dp[i][j] = dp[i-1][j];
    }
  }

  for(int i = 1; i <= size; ++i) {
    for(int j = sum / 2; j >= 0; --j) {
      if(dp[i][j]) return sum - j - j;
    }
  }
  return -1;
}

int main(void) {
  vector<int> nums{1, 2, 4, 4};
  cout << miniDiff(nums) << endl;
}

Follow Up, what if the two divided arrays has length diff with no more than 1, return the minimum difference sum. Question


INFO: [HLS 214-291] Loop 'VITIS_LOOP_56_2' is marked as complete unroll implied by the pipeline pragma (src/SmoothProfileOnXAxisMeanOptimize.cpp:56:19) INFO: [HLS 214-291] Loop 'VITIS_LOOP_43_1' is marked as complete unroll implied by the pipeline pragma (src/SmoothProfileOnXAxisMeanOptimize.cpp:43:19) INFO: [HLS 214-186] Unrolling loop 'VITIS_LOOP_56_2' (src/SmoothProfileOnXAxisMeanOptimize.cpp:56:19) in function 'SmoothProfileOnXAxisMeanOptimize' completely with a factor of 11 (src/SmoothProfileOnXAxisMeanOptimize.cpp:15:0) INFO: [HLS 214-186] Unrolling loop 'VITIS_LOOP_43_1' (src/SmoothProfileOnXAxisMeanOptimize.cpp:43:19) in function 'SmoothProfileOnXAxisMeanOptimize' completely with a factor of 32 (src/SmoothProfileOnXAxisMeanOptimize.cpp:15:0) INFO: [HLS 214-248] Applying array_partition to '_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6buffer': Complete partitioning on dimension 1. (src/SmoothProfileOnXAxisMeanOptimize.cpp:24:0) INFO: [HLS 214-248] Applying array_partition to '_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE3win': Complete partitioning on dimension 1. (src/SmoothProfileOnXAxisMeanOptimize.cpp:27:0) INFO: [HLS 200-111] Finished Compiling Optimization and Transform: CPU user time: 0 seconds. CPU system time: 0 seconds. Elapsed time: 6.958 seconds; current allocated memory: 202.637 MB. INFO: [HLS 200-111] Finished Checking Pragmas: CPU user time: 0 seconds. CPU system time: 0 seconds. Elapsed time: 0.002 seconds; current allocated memory: 202.637 MB. INFO: [HLS 200-10] Starting code transformations ... INFO: [HLS 200-111] Finished Standard Transforms: CPU user time: 0 seconds. CPU system time: 0 seconds. Elapsed time: 0.051 seconds; current allocated memory: 208.652 MB. INFO: [HLS 200-10] Checking synthesizability ... WARNING: [SYNCHK 200-23] src/SmoothProfileOnXAxisMeanOptimize.cpp:100: variable-indexed range selection may cause suboptimal QoR. INFO: [SYNCHK 200-10] 0 error(s), 1 warning(s). INFO: [HLS 200-111] Finished Checking Synthesizability: CPU user time: 0 seconds. CPU system time: 0 seconds. Elapsed time: 0.06 seconds; current allocated memory: 210.320 MB. INFO: [XFORM 203-401] Performing if-conversion on hyperblock from (src/SmoothProfileOnXAxisMeanOptimize.cpp:16:9) to (src/SmoothProfileOnXAxisMeanOptimize.cpp:90:9) in function 'SmoothProfileOnXAxisMeanOptimize'... converting 13 basic blocks. INFO: [XFORM 203-401] Performing if-conversion on hyperblock from (src/SmoothProfileOnXAxisMeanOptimize.cpp:94:45) in function 'SmoothProfileOnXAxisMeanOptimize'... converting 7 basic blocks. INFO: [XFORM 203-401] Performing if-conversion on hyperblock from (src/SmoothProfileOnXAxisMeanOptimize.cpp:89:13) to (src/SmoothProfileOnXAxisMeanOptimize.cpp:101:1) in function 'SmoothProfileOnXAxisMeanOptimize'... converting 10 basic blocks. INFO: [XFORM 203-11] Balancing expressions in function 'SmoothProfileOnXAxisMeanOptimize' (src/SmoothProfileOnXAxisMeanOptimize.cpp:10:1)...20 expression(s) balanced. INFO: [HLS 200-111] Finished Loop, function and other optimizations: CPU user time: 0 seconds. CPU system time: 0 seconds. Elapsed time: 0.157 seconds; current allocated memory: 233.824 MB. INFO: [HLS 200-111] Finished Architecture Synthesis: CPU user time: 0 seconds. CPU system time: 0 seconds. Elapsed time: 0.088 seconds; current allocated memory: 233.828 MB. INFO: [HLS 200-10] Starting hardware synthesis ... INFO: [HLS 200-10] Synthesizing 'SmoothProfileOnXAxisMeanOptimize' ... INFO: [HLS 200-10] ---------------------------------------------------------------- INFO: [HLS 200-42] -- Implementing module 'SmoothProfileOnXAxisMeanOptimize' INFO: [HLS 200-10] ---------------------------------------------------------------- INFO: [SCHED 204-11] Starting scheduling ... INFO: [SCHED 204-61] Pipelining function 'SmoothProfileOnXAxisMeanOptimize'. INFO: [HLS 200-1470] Pipelining result : Target II = 1, Final II = 1, Depth = 81, function 'SmoothProfileOnXAxisMeanOptimize' INFO: [SCHED 204-11] Finished scheduling. INFO: [HLS 200-111] Finished Scheduling: CPU user time: 0 seconds. CPU system time: 0 seconds. Elapsed time: 0.319 seconds; current allocated memory: 238.062 MB. INFO: [BIND 205-100] Starting micro-architecture generation ... INFO: [BIND 205-101] Performing variable lifetime analysis. INFO: [BIND 205-101] Exploring resource sharing. INFO: [BIND 205-101] Binding ... INFO: [BIND 205-100] Finished micro-architecture generation. INFO: [HLS 200-111] Finished Binding: CPU user time: 0 seconds. CPU system time: 0 seconds. Elapsed time: 0.118 seconds; current allocated memory: 239.660 MB. INFO: [HLS 200-10] ---------------------------------------------------------------- INFO: [HLS 200-10] -- Generating RTL for module 'SmoothProfileOnXAxisMeanOptimize' INFO: [HLS 200-10] ---------------------------------------------------------------- WARNING: [RTGEN 206-101] Design contains AXI ports. Reset is fixed to synchronous and active low. INFO: [RTGEN 206-500] Setting interface mode on port 'SmoothProfileOnXAxisMeanOptimize/points_in_z' to 'axis' (register, both mode). INFO: [RTGEN 206-500] Setting interface mode on port 'SmoothProfileOnXAxisMeanOptimize/smoothed_z' to 'axis' (register, both mode). INFO: [RTGEN 206-500] Setting interface mode on port 'SmoothProfileOnXAxisMeanOptimize/mean_win_size' to 'ap_none'. INFO: [RTGEN 206-500] Setting interface mode on port 'SmoothProfileOnXAxisMeanOptimize/invalid_z' to 'ap_none'. INFO: [RTGEN 206-500] Setting interface mode on function 'SmoothProfileOnXAxisMeanOptimize' to 'ap_ctrl_none'. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_1' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_2' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_3' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_4' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_5' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_6' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_7' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_8' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_9' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_10' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_11' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_12' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_13' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_14' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_15' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_16' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_17' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_18' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_19' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_20' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE6bu_21' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_buffer' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_buffer_1' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_buffer_2' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_buffer_3' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_buffer_4' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_buffer_5' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_buffer_6' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_buffer_7' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_buffer_8' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_buffer_9' is power-on initialization. WARNING: [RTGEN 206-101] Register 'p_ZZ32SmoothProfileOnXAxisMeanOptimizeRN3hls6streamIfLi0EEES2_7ap_uintILi6EEfE3wi' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_19' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_8' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_5' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_4' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_3' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_2' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_1' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_0' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_18' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_17' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_16' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_15' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_14' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_13' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_12' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_11' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_10' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_9' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_7' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_hls_stream_float_0_hls_stream_float_0_ap_uint_6_float_wi_s_6' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_win' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_win_1' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_win_2' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_win_3' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_win_4' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_win_5' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_win_6' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_win_7' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_win_8' is power-on initialization. WARNING: [RTGEN 206-101] Register 'SmoothProfileOnXAxisMeanOptimize_stream_stream_ap_uint_6_float_win_9' is power-on initialization. INFO: [HLS 200-1030] Apply Unified Pipeline Control on module 'SmoothProfileOnXAxisMeanOptimize' pipeline 'SmoothProfileOnXAxisMeanOptimize' pipeline type 'function pipeline' INFO: [HLS 200-1552] Enabling free running pipeline (frp) architecture on pipeline 'SmoothProfileOnXAxisMeanOptimize' in module 'SmoothProfileOnXAxisMeanOptimize'. Estimated max control fanout for pipeline is 10267. WARNING: [RTGEN 206-101] Port 'SmoothProfileOnXAxisMeanOptimize/mean_win_size' has no fanin or fanout and is left dangling. Please use C simulation to confirm this function argument can be read from or written to. INFO: [RTGEN 206-100] Generating core module 'ddiv_64ns_64ns_64_59_no_dsp_1': 1 instance(s).
最新发布
07-29
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值