这道题乍一看是动规 ,我才学动规,绝望,百度一下发现暴力也ok·····
但是有个易错点
浮点型的不能取余,那咋办··
再找个数组 int qian[i]
让double型的乘以10赋值给qian[I]
#include<stdio.h>
int max(int a,int b)
{
if(a>=b)
return a;
else
return b;
}
struct node
{
double a;
int b;
}ls[55];
int qian[105];
int main()
{
int q;
scanf("%d",&q);
while(q--)
{
int n,ans=0;
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%lf%d",&ls[i].a,&ls[i].b);
qian[i]=10*ls[i].a;
}
for(int i=1;i<=n;i++)
{
if(qian[i]%50==0)
{ans=max(ans,ls[i].b);}
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
if((qian[i]+qian[j])%50==0)
{ans=max(ans,ls[i].b+ls[j].b);}
}
}
for(int i=1;i<=n;i++)
{
for(int j=i+1;j<=n;j++)
{
for(int k=j+1;k<=n;k++)
{
if((qian[i]+qian[j]+qian[k])%50==0)
{ans=max(ans,ls[i].b+ls[j].b+ls[k].b);}
}
}
}
printf("%d\n",ans);
}
}
下面上动规的,网上找的,先码住,留到以后消化
- #include <iostream>
- #include <stdio.h>
- #include <string.h>
- using namespace std;
- int val[55];
- int data[55];
- int dp[55][5][5005];
- int main()
- {
- int T;
- scanf("%d",&T);
- while(T--)
- {
- int n;
- scanf("%d",&n);
- memset(dp,0,sizeof(dp));
- int i,j,k;
- int sum=0;
- for(i=1;i<=n;i++)
- {
- double f1;
- scanf("%lf %d",&f1,&data[i]);
- val[i]=(int )(10*f1);
- sum+=val[i];
- }
- dp[1][1][val[1]]=data[1];
- for(i=2;i<=n;i++)
- {
- dp[i][1][val[i]]=data[i];
- for(k=2;k<=3;k++)
- {
- for(j=val[i];j<=sum;j+=5)
- {
- int maxn=0;
- for(int h=1;h<i;h++)
- {
- if(dp[h][k-1][j-val[i]] >maxn )
- maxn=dp[h][k-1][j-val[i]];
- }
- if(maxn)
- dp[i][k][j]+=(maxn+data[i]);
- }
- }
- }
- int ans=0;
- for(i=0;i<=sum;i+=50)
- {
- for(j=1;j<=n;j++)
- {
- for(k=1;k<=3;k++)
- if(dp[j][k][i]>ans)
- ans=dp[j][k][i];
- }
- }
- printf("%d\n",ans);
- }
- return 0;
- }