HDUHDOJ 2602 Bone Collector(DP,01背包,贪心,经典题目)

    xiaoxiao2026-01-03  11

    http://acm.hdu.edu.cn/showproblem.php?pid=2602

    Bone Collector

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 51949    Accepted Submission(s): 21882 Problem Description Many years ago , in Teddy’s hometown there was a man who was called “Bone Collector”. This man like to collect varies of bones , such as dog’s , cow’s , also he went to the grave … The bone collector had a big bag with a volume of V ,and along his trip of collecting there are a lot of bones , obviously , different bone has different value and different volume, now given the each bone’s value along his trip , can you calculate out the maximum of the total value the bone collector can get ?   Input The first line contain a integer T , the number of cases. Followed by T cases , each case three lines , the first line contain two integer N , V, (N <= 1000 , V <= 1000 )representing the number of bones and the volume of his bag. And the second line contain N integers representing the value of each bone. The third line contain N integers representing the volume of each bone.   Output One integer per line representing the maximum of the total value (this number will be less than 2 31).   Sample Input 1 5 10 1 2 3 4 5 5 4 3 2 1   Sample Output 14   Author Teddy   Source HDU 1st “Vegetable-Birds Cup” Programming Open Contest  

    题意:

    第一行输入测试数据,第二行物品数,背包容量;

    第三行物品体积,第四行物品价值。

    0/1背包的基础类型题目,可以一试。但是贪心策略不知道哪里出错了。

    AC Code(0/1背包):

    #include<stdio.h> #include<cstring> #include<algorithm> using namespace std; const int MYDD=1103; struct Q { int w;//价值 int v;//体积 } bone[MYDD]; int MAX(int x,int y) { return x>y? x:y; } int main() { int TT; scanf("%d", &TT); while(TT--) { int dp[MYDD]; int N, V; scanf("%d%d", &N, &V); for(int j = 0; j < N; j++) { scanf("%d", &bone[j].w); } for(int j = 0; j < N; j++) { scanf("%d", &bone[j].v); } memset(dp, 0, sizeof(dp)); for(int j = 0; j < N; j++) { for(int k = V; k >= bone[j].v; k--) { dp[k]=MAX(dp[k], dp[k - bone[j].v] + bone[j].w); } } printf("%d\n",dp[V]); } return 0; } /* By:Shyazhut */ Code2(贪心,待AC):

    #include<stdio.h> #include<cstring> #include<algorithm> using namespace std; const int MYDD=1103; struct Q { int w;//价值 int v;//体积 } bone[MYDD]; bool cmp(Q x,Q y) { if(x.w != y.w) return x.w > y.w; return x.v < y.v; } int main() { int TT; scanf("%d", &TT); while(TT--) { int N, V; scanf("%d%d", &N, &V); for(int j = 0; j < N; j++) { scanf("%d", &bone[j].w); } for(int j = 0; j < N; j++) { scanf("%d", &bone[j].v); } sort(bone, bone+N, cmp);//贪心策略 int ans = 0; for(int j = 0; j < N; j++) { if(bone[j].v <= V) { ans += bone[j].w; V -= bone[j].v; } } printf("%d\n", ans); } return 0; } /* By:Shyazhut */

    转载请注明原文地址: https://ju.6miu.com/read-1305609.html
    最新回复(0)