?? 平衡秤.txt
字號:
#include <iostream>
#include <string>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
//平衡秤 動態(tài)規(guī)劃 NOJ 1023
//類似背包問題,注意只用2個一維空間就可存放狀態(tài)
#define MAX 5000002
#define NMAX 105
long f[2][MAX];//f[i][j] 前i個數(shù),數(shù)之和的一半為j的情況下所能取到的最大數(shù)之和
long a[NMAX];
long cal(long geshu,long max)
{
long i,j;
memset(f,0,sizeof(f));
for(i=1;i<=geshu;i++)
{
for(j=1;j<=max;j++)
{
if(j-a[i]>=0)
{ //可以放入第i個數(shù)
//兩種情況討論
if(f[(i-1)%2][j]<=f[(i-1)%2][j-a[i]]+a[i])
//如果放入第i個數(shù),所放數(shù)的和增加a[i],不過前i-1個數(shù)所限定的和要相應(yīng)減少
f[i%2][j]=f[(i-1)%2][j-a[i]]+a[i];
else f[i%2][j]=f[(i-1)%2][j];
}
else //放不下第i個數(shù)
f[i%2][j]=f[(i-1)%2][j];
}
}
return f[geshu%2][max];
}
int main()
{
long num,i,sum,answer,j=0;
while(scanf("%ld",&num)!=EOF)
{
sum=0;
j++;
for(i=1;i<=num;i++)
{
scanf("%ld",&a[i]);
sum+=a[i];
}
answer=cal(num,sum/2);
cout<<"Case "<<j<<": "<<answer<<" "<<sum-answer<<endl;
}
return 0;
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -