51nod 1007正整数分组

来源:互联网 发布:广告投放数据分析难吗 编辑:程序博客网 时间:2024/06/01 10:01

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[n][total]);return 0;}


0 0