Bone Collector-HDU
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 ?
![](http://acm.hdu.edu.cn/data/images/C154-1003-1.jpg)
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.
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 231).
Sample Input
1
5 10
1 2 3 4 5
5 4 3 2 1
Sample Output
14
Author
Teddy
Source
思路:
二维代码:
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; long long max(long long num1,long long num2)//比较函数 { return num1>num2?num1:num2; } long long dp[1005][1005];//定义背包数组 int main() { int t;//数据组数 int m_bone,m_volume; int bone[1005], volume[1005]; cin >> t; while (t--) { int i, j, k; memset(dp, 0, sizeof(dp));//初始化 memset(bone,0,sizeof(bone)); memset(volume, 0, sizeof(volume)); cin >> m_bone >> m_volume;//输入骨头总数和容量 for (i = 1; i <= m_bone; i++) cin >> bone[i];//输入价值 for (j = 1; j <= m_bone; j++) cin >> volume[j];//输入容量 for (i = 1; i <= m_bone; i++) { for (j = 0; j <= m_volume; j++) { if (j < volume[i])//如果装不下 { dp[i][j] = dp[i - 1][j];//将上一个值赋给当前的价值 continue; } else { dp[i][j] = max(dp[i - 1][j], dp[i - 1][j - volume[i]] + bone[i]);//动态转移方程 } } } cout << dp[m_bone][m_volume] << endl;//输出价值最大 } return 0; }
优化成:一维代码:
#include<stdio.h> #include<iostream> #include<string.h> using namespace std; long long max(long long num1,long long num2)//比较函数 { return num1>num2?num1:num2; } long long dp[1005];//定义背包数组 int main() { int N; int i,j,k; int bone[1005];//定义价值 int volume[1005];//定义容量 int t; scanf("%d",&t); while(t--) { memset(dp,0,sizeof(dp));//初始化 int count,weight; scanf("%d%d",&count,&weight);//输入组数和总重量 for(j=1;j<=count;j++) scanf("%d",&bone[j]); for(j=1;j<=count;j++) scanf("%d",&volume[j]); for(i=1;i<=count;i++) { for(k=weight;k>=0;k--) { if(k-volume[i]<0)//装不下 { break; } else dp[k]=max(dp[k-volume[i]]+bone[i],dp[k]); cout << dp[k] << endl; } } printf("%lld\n",dp[weight]); } return 0; }
以大多数人努力程度之低,根本轮不到去拼天赋~