//Problem link>>http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=24&page=show_problem&problem=503
#include <bits/stdc++.h>
#define mx 501*101
using namespace std ;
int coin [105] , n , dp[105][mx] ;
int call (int pos , int tot)
{
if (pos>n) return 0 ;
int &rez=dp[pos][tot] ;
if (rez != -1) return rez ;
int ret1=0 , ret2=0 ;
if (tot-coin[pos]==0) return rez=tot ;
else if (tot-coin[pos]>0)
{
ret1=coin[pos]+call (pos+1 , tot-coin[pos]) ;
ret2=call(pos+1 , tot) ;
rez=max(ret1,ret2) ;
return rez ;
}
return rez= call (pos+1,tot) ;
}
int main ()
{
cout<<mx<<endl ;
int t ,x ,i ;
cin>>t;
while (t--)
{
memset(dp,-1,sizeof (dp)) ;
cin>>n ;
int sum=0 ;
for (i=1 ; i<=n ; i++)
{
cin>>coin[i] ;
sum=sum+coin[i] ;
}
x = call (1,sum/2) ;
int res=sum-x*2 ;
cout<<res<<endl ;
}
return 0 ;
}
#include <bits/stdc++.h>
#define mx 501*101
using namespace std ;
int coin [105] , n , dp[105][mx] ;
int call (int pos , int tot)
{
if (pos>n) return 0 ;
int &rez=dp[pos][tot] ;
if (rez != -1) return rez ;
int ret1=0 , ret2=0 ;
if (tot-coin[pos]==0) return rez=tot ;
else if (tot-coin[pos]>0)
{
ret1=coin[pos]+call (pos+1 , tot-coin[pos]) ;
ret2=call(pos+1 , tot) ;
rez=max(ret1,ret2) ;
return rez ;
}
return rez= call (pos+1,tot) ;
}
int main ()
{
cout<<mx<<endl ;
int t ,x ,i ;
cin>>t;
while (t--)
{
memset(dp,-1,sizeof (dp)) ;
cin>>n ;
int sum=0 ;
for (i=1 ; i<=n ; i++)
{
cin>>coin[i] ;
sum=sum+coin[i] ;
}
x = call (1,sum/2) ;
int res=sum-x*2 ;
cout<<res<<endl ;
}
return 0 ;
}
No comments:
Post a Comment