您的位置:首页 > 其它

JD 1358:陈博的平均主义 && JD 1420:Jobdu MM分水果(01背包)

2014-08-23 15:11 337 查看


一堆数,分两拨,使得相差最少,当然是用01背包啦


OJ题目:click here~~

AC_CODE

const int inf = 1<<30 ;
int dp[98] ;
int sum ;
vector<int> x ;

void fun(int k){
sum = 0 ;
while(k){
x.push_back(k%10) ;
sum += (k%10) ;
k /= 10 ;
}
}

void DP(){
int i , j ;
memset(dp , 0 , sizeof(dp)) ;
for(i = 0;i < x.size();i++){
for(j = sum/2;j >= x[i];j--)
dp[j] = max(dp[j] , dp[j - x[i]] + x[i]) ;
}
}

int main(){
int n , i , j , k , A , B ;
//freopen("in.txt" , "r" , stdin) ;
while(scanf("%d%d",&A,&B) != EOF){
k = 0 ;
for(i = A;i <= B;i++){
x.clear() ;
fun(i) ;
if(x.size() == 1 || sum&1) continue ;
DP() ;
if(dp[sum/2] == sum/2) k++ ;
}
printf("%d\n",k) ;
}
return 0 ;
}






OJ题目:click here~~
AC_CODE

const int maxn = 108 ;
int dp[5000008] ;
int main(){
int n , i , j , k , sum ;
int x[maxn] ;
//freopen("in.txt" , "r" , stdin) ;
while(scanf("%d",&n) != EOF){
sum = 0 ;
memset(dp , 0 , sizeof(dp)) ;
for(i = 0;i < n;i++){
scanf("%d",&x[i]) ;
sum += x[i] ;
}
for(i = 0;i < n;i++){
for(j = sum/2;j >= x[i];j--)
dp[j] = max(dp[j] , dp[j - x[i]] + x[i]) ;
}
printf("%d\n",abs(sum - 2*dp[sum/2])) ;
}
return 0 ;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: