//之前純貪心算法做的,今天碰到一道類似的題目,發現了純貪心還不能做出這道題目。吸收了那道題目的正確答案之後,花了2分鐘,改成了這道題目的標準答案。
//貪心代碼:
#include<stdio.h>
struct NODE{
int a;
int b;
int c;
}tree[251];
int main()
{
int t,n,m,i,a,b,tm,tn,max,sum,ti;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&m);
for(i=1;i<=n;i++){
scanf("%d",&a);
tree[i].a=a;
tree[i].c=1;
}
for(i=1;i<=n;i++){
scanf("%d",&b);
tree[i].b=b;
}
tm=m;
tn=n;
sum=0;
while(tm-- && tn--){
max=-1;ti=0;
for(i=1;i<=n;i++){
if(tree[i].c && tree[i].a+tm*tree[i].b>max){
max=tree[i].a+tm*tree[i].b;
ti=i;
}
}
sum+=max;
tree[ti].c=0;
}
printf("%d\n",sum);
}
return 0;
}
//貪心+DP代碼:
/*
首先根據bb的值從小到大排序,然後進行dp。dp[i][j]表示前i 個選擇j個的最大值
dp[i][j]=max( dp[i-1][j] , dp[i-1][j-1]+第j個選擇第i個的value )
*/
#include<stdio.h>
#define M 5001
struct NODE{
int ll,bb;
}boy
,temp;
int dp
;
int max(int a,int b){
return a>b?a:b;
}
int main()
{
int n,k,t;
int i,j,tmp,p;
scanf("%d",&t);
while(t--){
scanf("%d%d",&n,&k);
for(i=1;i<=n;i++) scanf("%d",&boy[i].ll);
for(i=1;i<=n;i++) scanf("%d",&boy[i].bb);
//排序
for(i=1;i<n;i++){
p=i;
for(j=i+1;j<=n;j++){
if(boy[j].bb<boy[p].bb){
p=j;
}
}
if(p!=j){
temp=boy[p];boy[p]=boy[i];boy[i]=temp;
}
}
//初始化
for(i=0;i<=n;i++)
for(j=0;j<=n;j++)
dp[i][j]=0;
//DP
for(i=1;i<=n;i++){
for(j=1;j<=i && j<=k;j++){
if(i-1>=j)
dp[i][j]=dp[i-1][j];
tmp=boy[i].ll+boy[i].bb*(j-1);
dp[i][j]=max(dp[i][j],dp[i-1][j-1]+tmp);
}
}
printf("%d\n",dp[n][k]);
}
return 0;
}