这道题真心是特别特别水的,就一 n=2 的完全背包。
我们分析一下题意(我当初看了三遍居然把题都没看懂QAQ):就是有两种比赛,第一种花费 c 道题,晋级 n 个人,第二种花费 d 道题,晋级 1 个人;并且可以直接晋级的人数<=k。那么想都不用想,直接转移就行了:dp[i]=min(dp[i],dp[i-n]+c){i>=n}; dp[i]=min(dp[i],dp[i-1]+d);
唯一的问题是,可以直接晋级的人数<=k,从 n·m-k~n·m 枚举答案就完了。剩下的具体实现应该没有任何难度吧。。。
#include<iostream>
#include<string.h>
using namespace std;
int c,d,n,m,k,ans=99999999,dp[10005];
int main()
{
memset(dp,12,sizeof(dp)); //乱搞的初始化最大值(居然过了)
cin>>c>>d>>n>>m>>k;
dp[0]=0;
for(int i=1;i<=n*m;i++)
{
if(i>=n)/*避免数组越界*/ dp[i]=min(dp[i],dp[i-n]+c);
dp[i]=min(dp[i],dp[i-1]+d);
}
for(int i=n*m-k;i<=n*m;i++) //这个细节一定要记住
ans=min(ans,dp[i]);
cout<<ans;
return 0;
}