您的位置:首页 > 其它

51nod 1007正整数分组

2017-04-11 14:50 197 查看
dp问题 这是上学期算法实验的一个题 然而上学期的我还是太辣鸡并不会做。。。

简单来说就是用所有数凑出尽量接近于sum/2的结果,这个就可以用dp数组实现,不多说了看代码吧

//@auther zhou
//@Number 201408070203
//@start time:
//@finish time:
/*@此处注意:

*/
/* 测试数据

*/
#include<iostream>
#include<cstring>
#include<vector>
#include<cmath>
#include<algorithm>
using namespace std;
int dp[105][5005]={0};

int main(){
int n;
cin>>n;
int a[105];
int total1=0;
for(int i=0;i<n;i++){
cin>>a[i];
total1+=a[i];
}

int total=total1/2;

//要用那么多个数凑到total/2,不能大于它的情况下尽量逼近它
//dp[i][j]表示用前i个数中选出的数,总和不大于j的时候能得到的最大和
for(int i=1;i<=n;i++){
for(int j=1;j<=total;j++){

if(j<a[i-1]){//当前的和不够用了,所以就不取这个了
//cout<<"j"<<j<<" a[i-1]"<<a[i-1]<<"装不下"<<endl;
dp[i][j]=dp[i-1][j];
}
else{//j>a[i-1] 能装下这个数,那就是能装下的最大值了
// cout<<"装的下! j"<<j<<" a[i-1]"<<a[i-1]<<endl;
dp[i][j]=max(dp[i-1][j],dp[i-1][j-a[i-1]]+a[i-1]);
//cout<<"dpij的值为"<<dp[i][j]<<endl;
}
}
}

// for(int i=0;i<=n;i++){
// for(int j=0;j<=total;j++){
// cout<<dp[i][j]<<" ";
// }
// cout<<endl;
// }
cout<<(total1-2*dp
[total]);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: