题意:有几种使用方式及价格不一样的房间,n+k个男生,m+k个女生,其中k对情侣,求最小花费.
题解:dp裸背包,先对普通的房间进行普通的背包dp,更新后的结果遍历爆破。
#include<iostream>
#include<algorithm>
#define ll long long
using namespace std;
const ll inf=0x3f3f3f3f;
ll dp[6005];
int main(){
int t;
scanf("%d",&t);
while(t--){
ll n,m,k,a,b,c;
scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&k,&a,&b,&c);
int xx=max(n+k,m+k);
//for(int i=0;i<=xx;i++)dp[i]=inf;
memset(dp,0x3f,sizeof(dp));
dp[0]=0;
for(int i=1;i<=xx;i++){
if(i>=1)dp[i]=min(dp[i],dp[i-1]+a);
if(i>=2)dp[i]=min(dp[i],dp[i-2]+a);
if(i>=1)dp[i]=min(dp[i],dp[i-1]+b);
if(i>=2)dp[i]=min(dp[i],dp[i-2]+b);
if(i>=3)dp[i]=min(dp[i],dp[i-3]+b);
}
ll ans=inf;
for(int i=0;i<=k;i++)
ans=min(ans,dp[n+k-i]+dp[m+k-i]+i*c);
printf("%lld\n",ans);
}
return 0;
}
copy的MekakuCityActorblog