51nod 1007 正整數分組(01揹包)

2021-07-23 09:46:49 字數 1000 閱讀 1404

51nod 1007 正整數分組(類01揹包)

解決問題:

將一堆正整數分為2組,要求2組的和相差最小。(換言之:這n個數中選出一些數,這些數的總和不超過[sum / 2]且總和盡可能大。)

解決方法:

dp(i,j)表示:從前i個數中選出的數,總和不超過j的時候能得到的最大的和。

初始值: dp(0, x) = 0

遞推式是:【感覺有點類似01揹包】

dp(i,j) = dp(i−1,j) 【j < ai】//表示沒法取

dp(i,j) = max(dp(i−1,j),f(i-1,j−ai)+ai)【ai<=j<=[sum/2]】

//第乙個表示不取,第二個表示在取後對應值上加

我說怎麼這麼像01揹包呢,仔細一想,就是01揹包,只不過其價值和體積一樣罷了!

#include 

#include

#include

#include

#include

#include

#include

using

namespace

std;

#define ll long long

#define inf 0x3f3f3f3f

#define pi acos(-1.0)

#define e 2.71828

#define mod 1000000007

#define n 110

#define m 5010

int a[n];

int dp[m];

int main()

int bsum = sum/2;

memset(dp,0,sizeof(dp));

for(int i = 1; i <= n; i++)

printf("%d\n",abs(sum-2*dp[bsum]));

return

0;}

51Nod 1007 正整數分組

將一堆正整數分為2組,要求2組的和相差最小。例如 1 2 3 4 5,將1 2 4分為1組,3 5分為1組,兩組和相差1,是所有方案中相差最少的。input 第1行 乙個數n,n為正整數的數量。第2 n 1行,n個正整數。n 100,所有正整數的和 10000 output 輸出這個最小差input...

51Nod 1007 正整數分組

1007 正整數分組 基準時間限制 1 秒 空間限制 131072 kb 分值 10 難度 2級演算法題 將一堆正整數分為2組,要求2組的和相差最小。例如 1 2 3 4 5,將1 2 4分為1組,3 5分為1組,兩組和相差1,是所有方案中相差最少的。input 第1行 乙個數n,n為正整數的數量。...

51nod 1007 正整數分組

01揹包 需要多做這種題 能看到題想到這個思路 如果sum為奇數 比如 sum 5,那麼sum 2 就是2 所以 總共的sum dp sum 2 就是較大的那一塊分類 然後dp sum 2 就是較小的 然後兩者做差就是 相差最少的 includeusing namespace std const i...