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

2021-08-22 11:55:21 字數 1326 閱讀 7858

基準時間限制: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示例

仔細想一下也很好理解,可以看做是n個數字放在兩個袋子裡,所以對於每個數字,肯定會放在這兩個袋子中的其中乙個,即對於乙個袋子來說,數字非0即1(1代表放進去,0代表不放)。因為題目要求的是求兩個袋子裡的最小差值,所以把袋子的容量設為這些數字總和的1/2 。去計算在這個袋子裡最多能裝下的價值是多少(把每個數字看做價值和體積均為本身數值的物品),因為最後要求的是差值,所以要用總價值減去裝進乙個袋子中的價值*2

#include #include #include #include #include #include #include #include #include #include #include #include #define ll long long

#define ms(a) memset(a,0,sizeof(a))

#define pi acos(-1.0)

#define inf 0x3f3f3f3f

const double e=exp(1);

const int maxn=1e6+10;

using namespace std;

int a[maxn];

int dp[maxn];

int main(int argc, char const *argv)

for(int i=0;i=a[i];j--)

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

int _=abs(res-2*dp[res/2]);

cout<<_>

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