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

2021-08-07 14:34:28 字數 1407 閱讀 8958

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為正整數的數量。

第2 - n+1行,n個正整數。

(n <= 100, 所有正整數的和 <= 10000)

output

輸出這個最小差
input示例

512345

output示例

1
這個題可以轉換成揹包問題。

dp[i][j]表示從前i個數中選擇若干個數,總和不超過j的時候能得到的最大的值。

狀態轉移方程和揹包的類似。

#include#include#include#define inf 2<<30

#define n 10000+10

using namespace std;

typedef long long ll;

int dp[110][n];

int a[n];

int main()

{ int n;

cin>>n;

int sum=0;

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

cin>>a[i],sum+=a[i];

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

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

for(int j=0; j<=sum/2; j++)

if(j

同樣的,這個題也可以使用一維陣列來做,減少空間複雜度。

#include#include#include#define inf 2<<30

#define n 10000+10

using namespace std;

typedef long long ll;

int dp[n];

int a[n];

int main()

{ int n;

cin>>n;

int sum=0;

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

cin>>a[i],sum+=a[i];

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

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

for(int j=sum/2; j>=a[i]; j--)

dp[j]=max(dp[j],dp[j-a[i]]+a[i]);

cout<

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...