HDOJ 2602

简介: Bone Collector Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 14134    Accepted Submission(s...

Bone Collector

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 14134    Accepted Submission(s): 5585


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
View Code
 1 //下面的不对 
 2 #include <iostream>
 3 #include <cstring>
 4 using namespace std;
 5 typedef struct Node
 6 {
 7     int w,value;
 8 }Node;
 9 Node bag[1010];
10 int f[1010][1010];
11 int main()
12 {
13     int i,j,k,t,T;
14     cin>>T;
15     while(T--)
16     {
17         int n,c;
18         cin>>n>>c;
19         memset(bag,0,sizeof(bag));
20         memset(f,0,sizeof(f));
21         for(i=1;i<=n;i++)
22             cin>>bag[i].value;
23         for(i=1;i<=n;i++)
24             cin>>bag[i].w;
25         f[1][c] = bag[1].value;
26         for(i=2;i<=n;i++)
27         {
28             if(c>=bag[i].w)
29             {
30                 int temp = f[i-1][c-bag[i].w] + bag[i].value;
31                 f[i][c] = max(temp,f[i-1][c]);
32             }
33             else 
34                 f[i][c] = f[i-1][c];
35         }
36         cout<<f[n][c]<<endl;
37     }
38     return 0;
39 }
40         
 1 #include <iostream>
 2 #include <cstring>
 3 using namespace std;
 4 int w[1010];
 5 int value[1010];
 6 int f[1010][1010];
 7 int main()
 8 {
 9     int i,j,k,t,T;
10     cin>>T;
11     while(T--)
12     {
13         int n,c;
14         cin>>n>>c;
15         memset(w,0,sizeof(w));
16         memset(f,0,sizeof(f));
17         memset(value,0,sizeof(value));
18         for(i=1;i<=n;i++)
19             cin>>value[i];
20         for(i=1;i<=n;i++)
21             cin>>w[i];
22         for(i=1;i<=n;i++)
23             for(j=0;j<=c;j++)
24             if(j>=w[i])
25             {
26                 f[i][j] = max(f[i-1][j],f[i-1][j-w[i]] + value[i]);
27             }
28             else
29                 f[i][j] = f[i-1][j];
30                 /*
31                 //原来没加这一条语句
32                 1
33                 5 0
34                 2 4 1 5 1
35                 0 0 1 0 0
36                 答案应该是12
37                 却输出6 
38                 */ 
39             cout<<f[n][c]<<endl;
40     }
41     return 0;
42 }
43         

 

 1 //此时g++提交ac,c++wa,因为第二十九行的符号 
 2 #include <iostream>
 3 #include <cstring>
 4 using namespace std;
 5 int w[1010];
 6 int value[1010];
 7 int f[1010][1010];
 8 int main()
 9 {
10     int i,j,k,t,T;
11     cin>>T;
12     while(T--)
13     {
14         int n,c;
15         cin>>n>>c;
16         memset(w,0,sizeof(w));
17         memset(f,0,sizeof(f));
18         memset(value,0,sizeof(value));
19         for(i=1;i<=n;i++)
20             cin>>value[i];
21         for(i=1;i<=n;i++)
22             cin>>w[i];
23         for(i=1;i<=n;i++)
24             for(j=0;j<=c;j++)
25             {
26                 f[i][j] = f[i-1][j];
27                 if(j>=w[i])
28                 {
29                     f[i][j] >?= f[i-1][j-w[i]] + value[i];
30                 }
31             }
32             cout<<f[n][c]<<endl;
33     }
34     return 0;
35 }
36         

 

 1 //滚动数组优化空间和时间复杂度 ,时间上不太明显 
 2 #include <iostream>
 3 #include <cstring>
 4 using namespace std;
 5 int w[1010];
 6 int value[1010];
 7 int f[1010];
 8 int main()
 9 {
10     int i,j,k,t,T;
11     cin>>T;
12     while(T--)
13     {
14         int n,c;
15         cin>>n>>c;
16         memset(w,0,sizeof(w));
17         memset(f,0,sizeof(f));
18         memset(value,0,sizeof(value));
19         for(i=1;i<=n;i++)
20             cin>>value[i];
21         for(i=1;i<=n;i++)
22             cin>>w[i];
23         for(i=1;i<=n;i++)
24             for(j=c;j>=w[i];j--)
25             {
26                 f[j] >?= f[j-w[i]] + value[i];
27             }
28             cout<<f[c]<<endl;
29     }
30     return 0;
31 } 
32 //注意一条:不可用结构体存储重量和价值      

 

目录
相关文章
|
JavaScript
HDOJ 1865
点击打开链接 输入用字符串输入,存入数组中,题目的数据最大250位 代码: #include #include #include #include using namespace std; int s[1010][250]; v...
804 0
HDOJ 2802 F(N)
HDOJ 2802 F(N)
111 0
HDOJ 2802 F(N)
|
人工智能
HDOJ 2019 数列有序!
Problem Description 有n(n
829 0
HDOJ 1092
第一次没给sum赋初值,得出了一个绝对值超大的负数,而且sum=0要放在while内的其他语句之前, #include int main() { int sum,temp;int T; while(scanf("%d",&T),T) { sum=0; while(T...
701 0
HDOJ 1089
#includeint main(){ int a,b,sum; while(scanf("%d%d",&a,&b)!=EOF)//或者while(~scanf("%d%d",&a,&b))//-1补码的32位全是1//while(scanf("%d%d",&a,&b)+1) printf("%d\...
611 0
|
Java C++
hdoj 1715 大菲波数
先java代码
63 1
HDOJ 2004 成绩转换
HDOJ 2004 成绩转换
106 0
HDOJ 2013 蟠桃记
HDOJ 2013 蟠桃记
104 0

热门文章

最新文章