| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
哪位大牛帮看看啊,我的动态规划的子问题难道处理错了吗,多谢了#include<stdio.h>
#include<algorithm>
#define max 99999
int t;
int isok[201][21];
int greata,greatb;
struct Node
{
int number;
int data;
};
Node a[200],b[200],minus[200],plus[200];
int sign[201][21];
int answer[21];
int cmp(const void * a,const void * b)
{
struct Node * c=(struct Node *)a;
struct Node * d=(struct Node *)b;
if(c->data!=d->data)return c->data-d->data;
else return c->number-d->number;
}
int cmp2(const void* a,const void* b)
{
return *(int* )a-*(int *)b;
}
int fun(int i)//取绝对值
{
if(i<0)return -i;
else return i;
}
int dp(int n,int m)//这就是我的动态规划代码,麻烦大牛看看是否有问题啊,哪里 的问题啊
{
if(isok[n][m]==1) return sign[n][m];
int temp=0;
if(m==0)
{
sign[n][m]=0;
isok[n][m]=1;
return 0;
}
if(n<m)
{
isok[n][m]=1;
sign[n][m]=max;
return sign[n][m];
}
if(n<0)return max;
sign[n-1][m]=dp(n-1,m);
sign[n-1][m-1]=dp(n-1,m-1);
isok[n-1][m]=1;
isok[n-1][m-1]=1;
if(fun(sign[n-1][m])<fun(sign[n-1][m-1]+minus[n-1].data))
{
return sign[n-1][m];
}
else
{
return sign[n-1][m-1]+minus[n-1].data;
}
}
int main()
{
int m,n;
t=0;
int t1;
int t2;
int round=1;
greata=0;greatb=0;
while(scanf("%d%d",&n,&m))
{
if(n==0&&m==0)break;
for(int i=0;i<n;i++)
{
minus[i].number=plus[i].number=b[i].number=a[i].number=i;
scanf("%d%d",&a[i].data,&b[i].data);
plus[i].data=a[i].data+b[i].data;
}//输入的结果
qsort(plus,n,sizeof(plus[0]),cmp);//按照和的从小到大排序
for(int i=0;i<n;i++)
{
int number=plus[i].number;
minus[i].data=a[number].data-b[number].data;
minus[i].number=number;
}
for(int i=0;i<=n;i++)
for(int j=0;j<=m;j++)
{sign[i][j]=0;//记录数据
isok[i][j]=-1;//记录是否已经搜索过了
}
t=dp(n,m);//这一步结果就不对了,哪位大牛帮忙看看啊,多谢了
/////////下面不用看,上面错了
t=0;
for(int i=n,j=m;j>0;)
{
t1=dp(i-1,j);
t2=dp(i-1,j-1);
if(fun(t1)<fun(t2+minus[i-1].data))
{
i--;
}
else
{
answer[t++]=minus[i-1].number;
greata+=a[minus[i-1].number].data;
greatb+=b[minus[i-1].number].data;
j--;
i--;
}
}
printf("Jury #%d\n",round);
printf("Best jury has value %d for prosecution and value %d for defence:\n",greata,greatb);
qsort(answer,t,sizeof(int),cmp2);
for(int i=0;i<t;i++)
printf(" %d",answer[i]+1);
printf("\n");
}
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator