都说贪心来着
里面确实有贪心思想,要排序
排序后用01背包来做的
这个比较特殊,每个物品的费用是1,价值是val,状态转移方程显而易见:
dp【j】=max(dp【j】,dp【j-1】+node【i】.val);
再有就是条件了,假如超过天数了就不能装进背包了
``
#include <algorithm>
#include <string.h>
using namespace std;
int dp[10005];
int n,t;
struct Node{
int day;
int val;
friend bool operator < (Node a,Node b){
if(a.day==b.day){
return a.val>b.val;
}return a.day<b.day;
}
}node[1005];
void aprinf(){
for(int i=0;i<=n;i++){
cout<<dp[i]<<" ";
}cout<<endl;
}
int main()
{
cin>>t;
int i,j,k;
while(t--){
cin>>n;
int sum=0;
memset(dp,0,sizeof dp);
for(i=1;i<=n;i++)cin>>node[i].day;
for(i=1;i<=n;i++){
cin>>node[i].val;
sum+=node[i].val;
}
sort(node+1,node+1+n);
int ansof=0;
for(i=1;i<=n;i++){
for(j=n;j>=1;j--){
if(node[i].day>=j){
dp[j]=max(dp[j],dp[j-1]+node[i].val);
ansof=max(dp[j],ansof);
}
}
}
cout<<sum-ansof<<endl;
}
return 0;
}