• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >编程问答 > 分班问题(背包问题)?

分班问题(背包问题)?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-07

佚名通过本文主要向大家介绍了背包问题,01背包问题,01背包问题动态规划,背包问题动态规划,背包问题算法等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题:分班问题(背包问题)?
描述:

有100名学生的成绩,每个班级50人,要求两个班级的平均分越接近越好,如何分配两个班级?
用C++实现。

#include <iostream>
#include <cstring>
#include <ctime>
const int N=5000;
const int M=100;
const int K=50;
int A[N+1][M+1][K+1];
int B[N+1];
int Score[M+1];
using namespace std;
int main(int argc,char **argv){
    srand(time(NULL));
    Score[0]=0;
    memset(A,0,sizeof(int)*(N+1)*(M+1)*(K+1));
    for(int i=1;i<=M;i++)
        Score[i]=rand()%41+60;

    int k=0;    
    for(int i=1;i<=M;i++){
        for(int j=0;j<=N;j++)
        if(j+Score[i]<=2500 && k<=50 &&  A[j][i][k]+Score[i]<A[j][i][k]-Score[i])
            A[j+Score[i]][i][k++]=A[j][i][k]+Score[i];
        else
            A[j][i][k]-=Score[i];
    }
}

这是我的代码,麻烦之指出错误。应该是在状态转移方程那里。


解决方案1:

这不是一个标准的 背包问题, 往上面套也挺费劲. 不如就当作一般的dp来处理好了.

也没太看懂你的程序. 我按我的理解写了一个java的. 首先求出 所有学生的 总成绩 / 2, 设为half, 此题 即为找出50个学生, 其总成绩最接近此 half值.

dp 表为 Set<Integer> dp[][] = new HashSet[N / 2 + 1][half + 1]; 对每一个dp[i][j], 即选出i个学生, 其总成绩最接近j; 每一个Set包含 此 i个学生在score数组中的下标.

只做了最简单的测试, 不保证程序完全正确.

public Set<Integer> sep(int[] score){
    int N = score.length;
    int half = Arrays.stream(score).sum() / 2;
    @SuppressWarnings("unchecked")
    Set<Integer> dp[][] = new HashSet[N / 2 + 1][half + 1];
    for(int i = 0; i < half + 1; i++)
        dp[0][i] = new HashSet<>();
    for(int i = 1; i <= N / 2; i++)
        for(int k = 0; k < N; k++)
            for(int j = score[k]; j <= half; j++)
                if(dp[i - 1][j - score[k]] != null && !dp[i - 1][j - score[k]].contains(k)){
                    if(dp[i][j] == null)
                        dp[i][j] = new HashSet<>();
                    if(sum(dp[i - 1][j - score[k]]) + score[k] > sum(dp[i][j])){
                        dp[i][j].clear();
                        dp[i][j].addAll(dp[i - 1][j - score[k]]);
                        dp[i][j].add(k);
                    }
                }
    return dp[N / 2][half];
}

private int sum(Set<Integer> list) {
    int sum = 0;
    for(int n: list)
        sum += n;
    return sum;
}

@Test
public void test(){
    testBase(5, new int[]{1, 3, 4, 4});
}

@Test
public void test2(){
    testBase(7, new int[]{1, 1, 2, 3, 4, 4});
}

@Test
public void test3(){
    testBase(4, new int[]{1, 0, 2, 1, 3, 2});
}

private void testBase(int target, int[] score) {
    int sum = 0;
    for(int i: sep(score))
        sum += score[i];
    assertEquals(target, sum);
}

用一维数组节省内存的做法:

public Set<Integer> sep(int[] score){
    int N = score.length;
    int half = Arrays.stream(score).sum() / 2;
    @SuppressWarnings("unchecked")
    Set<Integer> dp[] = new HashSet[half + 1];
    for(int i = 0; i <= half; i++)
        dp[i] = new HashSet<>();
    for(int i = 1; i <= N / 2; i++)
        for(int k = 0; k < N; k++)
            for(int j = half; j >= score[k]; j--){
                if(dp[j - score[k]].contains(k))
                    continue;
                if(sum(dp[j - score[k]]) + score[k] > sum(dp[j])){
                    dp[j].clear();
                    dp[j].addAll(dp[j - score[k]]);
                    dp[j].add(k);
                }
            }
    return dp[half];
}


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 数据结构背包问题数据结构设计的问题,关于数据的接收与计数
  • python安装sh问题
  • 初次分配和再分配算法:分配问题
  • Leetcode242,关于数组递增和遍历的一点问题
  • Python的回调问题
  • python打印列表问题
  • 动态规划的动态转移公式不懂··
  • pythontkinercanvas动态添加图片问题
  • (python)nginxrewrite配置问题
  • markdownpython的markdown问题

相关文章

  • 2017-06-07 (golang)Dart中的switch为何还需要break
  • 2017-06-07 七牛javascriptsdk求助
  • 2017-06-07 请问python3如何比较稳妥地使用多进程在向同一个日志中写日志呢
  • 2017-06-07 (laravel)这个$errors有时候不存在,为什么blade不报错呢?
  • 2017-06-07 会员储值卡管理系统[会员储值]怎么翻译成英文?
  • 2017-06-07 关于函数对象
  • 2017-06-07 jbpm如何实现多个taskassignee
  • 2017-06-07 修改注册邮箱
  • 2017-06-07 七牛callback调试问题
  • 2017-06-07 在IE78下七牛上传的图片会导致IE弹出下载框,应该如何处理?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • sqlmap(python)sqlmap源码中的一个问题
    • 身为phper,如何有效地提高自己的算法水平,逻辑能力?
    • 关于七牛云储存后台管理问题
    • pythonflask不同IP显示不同图片?新手求高人
    • 下列有关openSSL的PHP代码,如果用Python实现?
    • 手机第一次充电需要多长时间七牛鉴黄需要多长时间
    • Laravel中如何使用View::make生成自己的html片段,我生成了一下出错。
    • memcache缓存分页方式。
    • 如何使用云存储如何使用pythonnrtworkx将图放大?
    • 七牛delete文件跨域问题,七牛有什么地方能将我的域名加入解决这个问题吗

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有