LETTers第五场-Bone Collector-解题报告
题目描述:
有一个爱收集骨头(不良癖好)的家伙,他有一个背包,容积是V。现在有n块骨头,每块骨头有两个属性:体积volume和价值value。问他能够收集的骨头的价值之和最大是多少。
题面建模:
简单背包问题。
背包已用容积是j时,dp[j]=max(dp[j],dp[j-volumek]+valuek)。
转移方程:dp[j]=dp[j]>dp[j-bone[i][1]]+bone[i][0]?dp[j]:dp[j-bone[i][1]]+bone[i][0];
解题要点:
注意边界的处理。
时空开销分析:
空间复杂度:O(n)。
时间复杂度:O(n^2)。
特别说明:
无。
程序:
#include <stdio.h> #include <string.h> int bone[1010][2]; int dp[1010]; int main() { int n,v,t,max,i,j; scanf("%d",&t); while(t--) { memset(bone,0,sizeof(bone)); memset(dp,0,sizeof(dp)); scanf("%d %d",&n,&v); for(i=0;i<2*n;i++) scanf("%d",bone[i%n]+i/n); for(i=0;i<n;i++) for(j=v;j-bone[i][1]>=0;j--) dp[j]=dp[j]>dp[j-bone[i][1]]+bone[i][0]?dp[j]:dp[j-bone[i][1]]+bone[i][0]; printf("%d\n",dp[v]); } return 1; }