java算法提高求最大值_藍橋杯 算法提高 求最大值
算法提高 求最大值
時間限制:1.0s ? 內存限制:256.0MB
問題描述給n個有序整數對ai bi,你需要選擇一些整數對 使得所有你選定的數的ai+bi的和最大。並且要求你選定的數對的ai之和非負,bi之和非負。輸入格式輸入的第一行為n,數對的個數 以下n行每行兩個整數 ai bi輸出格式輸出你選定的數對的ai+bi之和樣例輸入5-403 -625-847 901-624 -708-293 413886 709樣例輸出1715數據規模和約定1<=n<=100 -1000<=ai,bi<=1000
這道題呢 ?神奇的背包變種- -。 首先呢 ?背包是沒有負數的- -這時候就需要把負數變成正數 然后背包一下 ?動態規劃出所有可能的結果
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int d[400005];
int a[400005],b[400005];
int ss=100000;
int main()
{
int n;
while(cin>>n)
{
memset(d,-1,sizeof(d));
int x,y;
int s;
d[200000]=1; //以20w的中間值作為數軸的0點
for(int i=0;i
{
cin>>x>>y;
if(x+y>0) //當輸出的兩個數的和為整數的時候,倒著放 和01背包相同
{
for(int j=400000;j>=0;j--)
{
if(j-x-y>=0&&j-x-y<=400000)
{
if(d[j]==1&&d[j-x-y]==1)
{
a[j]=max(a[j],a[j-x-y]+x);
b[j]=max(b[j],b[j-x-y]+y);
}
else if(d[j]
{
a[j]=a[j-x-y]+x;
b[j]=b[j-x-y]+y;
}
d[j]=max(d[j],d[j-x-y]);
if(d[j]==1)
{
// cout<
}
}
}
}
else //然后呢 小於0的時候 正著放 和01背包相同
{
for(int j=0;j<=400000;j++)
{
if(j-x-y>=0&&j-x-y<=400000)
{
if(d[j]==1&&d[j-x-y]==1)
{
a[j]=max(a[j],a[j-x-y]+x);
b[j]=max(b[j],b[j-x-y]+y);
}
else if(d[j]
{
a[j]=a[j-x-y]+x;
b[j]=b[j-x-y]+y;
}
d[j]=max(d[j],d[j-x-y]);
if(d[j]==1)
{
//cout<
}
}
}
}
}
int i;
for(i=400000;i>200000;i--)
{
if(d[i]==1&&a[i]>=0&&b[i]>=0) //這時候就是找,最大的值
{
cout<
break;
}
}
if(i<=200000)
{
cout<
}
}
}
總結
以上是生活随笔為你收集整理的java算法提高求最大值_藍橋杯 算法提高 求最大值的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python学习笔记:常用内建模块4:h
- 下一篇: java 用户线程如何修改界面内容_ja