简单题意
给出背包能装的骨头容量,给出每个骨头所占容积,和价值,求出背包所能装骨头的最大价值
解题思路形成过程
这类背包问题做多了,套路就出来了,每个骨头开始遍历,如果背包容量能盛下这个骨头,那就看是否当前容量下的价值,是否比“没加当前骨头容量的价值,加上当前骨头的价值”的价值大,否则就拿上这块骨头
感想
背包问题,也可以用dp做,感觉比贪心好理解一点。
AC代码
#include<iostream>
#include<string.h>
#include<stdio.h>
#include<fstream>
using namespace std;
int val[1005];
int vol[1005];
int dp[1005];
int main(){
ifstream cin("in.txt");
freopen("in.txt","r",stdin);
int t;
int n,v;
cin>>t;
while(t--){
cin>>n>>v;
memset(dp,0,sizeof(dp));
for(int i=1;i<=n;i++)cin>>val[i];
for(int i=1;i<=n;i++)cin>>vol[i];
for(int i=1;i<=n;i++){
for(int j=v;j>=vol[i];j--){
if(dp[j]<dp[j-vol[i]]+val[i])
dp[j]=dp[j-vol[i]]+val[i];
}
}
cout<<dp[v]<<endl;
}
return 0;
}