zoukankan      html  css  js  c++  java
  • 九度 1420 Jobdu MM分水果 -- 动态规划、深度优先搜索

    题目地址:http://ac.jobdu.com/problem.php?pid=1420

    题目描述:

    Jobdu团队有俩PPMM,这俩MM干啥都想一样。一天,富强公司给团队赞助了一批水果,胡老板就把水果派发给了这俩MM,由她们自行分配。每个水果都有一个重量,你能告诉她们怎么分才使得分得的重量差值最小吗?

    输入:

    输入有多组数据,每组数据第一行输入水果个数n(1<=n<=100),接下来一行输入n个重量wi(0<=wi<=10^5)。

    输出:

    对每组输入输出一行,输出可以得到的最小差值。

    样例输入:
    510 20 30 10 10 
    样例输出:
    0

    0/1背包解法:

    //题目地址:http://ac.jobdu.com/problem.php?pid=1420
    #include <stdio.h>
    #include <string.h>
    
    #define Max(a, b) (a > b)?(a):(b);
    
    int n, sum;
    int fruit[100];
    int dp[5000001];
    
    int MinDiff(){
        int i, j;
        int first, second, ans;
        int half = (sum >> 1);
        memset(dp, 0, sizeof(dp));
        for (i = 0; i < n; ++i){
            for (j = half; j >= fruit[i]; --j){
                dp[j] = Max(dp[j], dp[j-fruit[i]] + fruit[i]);
            }
        }
        return sum - 2 * dp[half];
    }
    int main(int argc, char *argv[]) {
        int i;
        while (scanf("%d", &n) != EOF){
            sum = 0;
            for (i = 0; i < n; ++i){
                scanf("%d", &fruit[i]);
                sum += fruit[i];
            }
            printf("%d
    ", MinDiff());
        }
        return 0;
    }
    /**************************************************************
    Problem: 1420
    User: 简简单单Plus
    Language: C
    Result: Accepted
    Time:1170 ms
    Memory:20444 kb
    ****************************************************************/        
    

    深度优先搜索解法:

    #include <stdio.h>
    #include <string.h>
    
    int n, k, fruit[100], used[100], total, half;
    
    void dfs(int x, int y) {
        int i;
        if (y > half) return;
        if (y > k) k = y;
        if (k == half) return;
        for (i = x; i < n; i++)
          if (!used[i]) {
            used[i] = 1;
            dfs(i + 1, y + fruit[i]);
            used[i] = 0;
        }
    }
    
    int main() {
        int i;
        while(scanf("%d",&n) != EOF) {
            total = 0;
            for(i = 0;i < n; i++) {
                scanf("%d", &fruit[i]);
                total += fruit[i];
            }
            k = -1;
            half = total >> 1;
            memset(used, 0, sizeof(used));
            dfs(0, 0);
            printf("%d
    ", total- k * 2);
        }
        return 0;
    }
    /**************************************************************
    Problem: 1420
    User: 简简单单Plus
    Language: C
    Result: Accepted
    Time:50 ms
    Memory:916 kb
    ****************************************************************/                                    
    
     


  • 相关阅读:
    [Android Pro] 将你的安卓手机屏幕共享到PC或Mac上
    [Android Pro] 使用apktool工具遇到could not decode arsc file的解决办法
    [Android Pro] Test win
    [Android] 深入浅出Android App耗电量统计
    [Android] adb shell dumpsys的使用
    [Android] adb 命令 dumpsys activity , 用来看 task 中的activity。 (uninstall virus)
    [Android Pro] svn实例
    [Android Pro] 告别编译运行 ---- Android Studio 2.0 Preview发布Instant Run功能
    [Android Pro] 网络流量安全测试工具Nogotofail
    python pandas replace函数
  • 原文地址:https://www.cnblogs.com/liushaobo/p/4373738.html
Copyright © 2011-2022 走看看