Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

刚看完背包9讲之第3讲,照着写了写,贴出来献丑!

Posted by damacheng009 at 2010-09-27 23:15:26 on Problem 1014
#include <cstdio>

int marbles[7];
int dp[60010];
bool status[60010];
int e[21];

int main() {
    //freopen("e:/data.txt", "r", stdin);
    e[1] = 1;
    for(int i = 2; i <= 20; ++i) {
        e[i] = e[i - 1] * 2;
    }

    int c = 1;
    while(true) {
        scanf("%d %d %d %d %d %d", &marbles[1], &marbles[2], &marbles[3], &marbles[4], &marbles[5], &marbles[6]);
        if(marbles[1] == 0 && marbles[2] == 0 && marbles[3] == 0 && marbles[4] == 0 && marbles[5] == 0 && marbles[6] == 0) {
            break;
        }

        printf("Collection #%d:\n", c++);

        int s = 0;
        for(int i = 1; i <= 6; ++i) {
            s += marbles[i] * i;
        }

        if(s & 1) {
            printf("Can't be divided.\n\n");
            continue;
        }

        int pack = s / 2;

        for(int i = 0; i <= pack; ++i) {
            dp[i] = 0;
            status[i] = false;
        }

        status[0] = true;

        int cur_value;
        for(int i = 1; i <= 6; ++i) {
            if(marbles[i] * i >= pack) {
                cur_value = i;
                for(int j = cur_value; j <= pack; ++j) {
                    if(status[j - cur_value] == true) {
                        dp[j] = dp[j] > dp[j - cur_value] + cur_value ? dp[j] : dp[j - cur_value] + cur_value;
                        status[j] = true;
                    }
                }
            } else {
                if(marbles[i] > 1) {
                    bool flag = true;
                    int k = 1;
                    int rest = marbles[i];

                    while(flag) {
                        if(e[k] > rest) {
                            cur_value = rest * i;
                            flag = false;
                        } else if(e[k] == rest){
                            cur_value = rest * i;
                            flag = false;
                        } else {
                            cur_value = e[k] * i;
                            rest -= e[k++];
                        }

                        for(int j = pack; j >= cur_value; --j) {
                            if(status[j - cur_value] == true) {
                                dp[j] = dp[j] > dp[j - cur_value] + cur_value ? dp[j] : dp[j - cur_value] + cur_value;
                                status[j] = true;
                            }
                        }
                    }
                } else if(marbles[i] == 1) {
                    cur_value = i;
                    for(int j = pack; j >= cur_value; --j) {
                        if(status[j - cur_value] == true) {
                            dp[j] = dp[j] > dp[j - cur_value] + cur_value ? dp[j] : dp[j - cur_value] + cur_value;
                            status[j] = true;
                        }
                    }
                }
            }
        }

        if(status[pack] == true && dp[pack] == pack) {
            printf("Can be divided.\n\n");
        } else {
            printf("Can't be divided.\n\n");
        }
    }

    return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator