#11113: TLE(6s)


vagrantlike (丫維)

學校 : 不指定學校
編號 : 27614
來源 : [114.24.87.102]
最後登入時間 :
2020-01-23 17:45:52
a587. 祖靈好孝順 ˋˇˊ -- 祖靈的的大背包 | From: [163.29.253.105] | 發表日期 : 2016-06-29 13:49

可以給個方向改進嘛?thanks'

程式碼如下:

///////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//範圍:0<N<=100    ,      0<=重量, 價值<=2000      ,     0<重量限制<=10000
#define N  100      // 物品總數上限
#define W 100000   // 背包耐重上限

int n = 0, temp_n= 0,i=0,j=0,k=0,w=10000;

//(可以使用物品的總重量作為此值)
int cost[N], weight[N]; // 物品的價值與重量
int c[N + 1][W + 1];    // DP表格

void knapsack(int, int) ;
int max(int, int) ;

int main() {

    while(scanf("%d",&n)==1) {
        i=0;
        temp_n = n;

        while(temp_n--) {
            scanf("%d %d",&weight[i],&cost[i]);
            ++i;
        }

        scanf("%d",&w);
        knapsack(n,w);
       
        printf("%d\n",c[n][w]);
    }

    return 0;
}

int max(int a,int b) {
    return (a>=b)?(a):(b);
}

//bottom-up
void knapsack(int n, int w) {
    int i = 0,j=0;
    memset(c, 0, sizeof(c));

    for (i = 0; i <= n; ++i) {    // 窮舉每種物品
        for (j = 0; j <= w; ++j) { // 窮舉每種重量
            if (j - weight[i] < 0) {
                // 耐重能力不足,故只能不放。
                c[i+1][j] = c[i][j];
            } else {
                // 耐重能力足夠,可以放或不放。
                c[i+1][j] = max(
                                c[i][j],
                                c[i][j] - weight[i] + cost[i]
        );
            }
        }
    }
}

 
#11114: Re:TLE(6s)


vagrantlike (丫維)

學校 : 不指定學校
編號 : 27614
來源 : [114.24.87.102]
最後登入時間 :
2020-01-23 17:45:52
a587. 祖靈好孝順 ˋˇˊ -- 祖靈的的大背包 | From: [163.29.253.105] | 發表日期 : 2016-06-29 14:10

參考DJWS大大演算法筆記

程式碼修改後成功AC了:

///////////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

//範圍:0<N<=100    ,      0<=重量, 價值<=2000      ,     0<重量限制<=10000
#define N  100      // 物品總數上限
#define W 100000   // 背包耐重上限

int n = 0, temp_n= 0,i=0,j=0,k=0,w=10000;

// 物品的價值與重量,合併成一個物件。
struct Item {
    int cost, weight;
} items[N];


int c[W + 1];

int max(int,int);

void knapsack(int, int) ;
int max(int, int) ;

int main() {

    while(scanf("%d",&n)==1) {
        i=0;
        temp_n = n;

        while(temp_n--) {
            scanf("%d %d",&items[i].weight,&items[i].cost);
            ++i;
        }

        scanf("%d",&w);

        knapsack(n,w);
        printf("%d\n",c[w]);

    }

    return 0;
}

int max(int a,int b) {
    return (a>=b)?(a):(b);
}

void knapsack(int n, int w) {
    int i = 0,j =0, weight = 0,cost =0;
    memset(c, 0, sizeof(c));

    for (i = 0; i < n; ++i) {
        weight = items[i].weight;
        cost = items[i].cost;

        for (j = w; j - weight >= 0; --j) {
            c[j] = max(c[j], c[j - weight] + cost);
        }
    }
}




 
ZeroJudge Forum