题意:比赛 至少 要晋级n×m 个人 ,使用题目数C 可以晋级 n 个人 使用题目1d 可以晋级1个人 问最少需要多少题目
解题思路:完全背包。
解题代码:
1 // File Name: 417c.cpp 2 // Author: darkdream 3 // Created Time: 2015年03月12日 星期四 19时59分52秒 4 5 #include<vector> 6 #include<list> 7 #include<map> 8 #include<set> 9 #include<deque> 10 #include<stack> 11 #include<bitset> 12 #include<algorithm> 13 #include<functional> 14 #include<numeric> 15 #include<utility> 16 #include<sstream> 17 #include<iostream> 18 #include<iomanip> 19 #include<cstdio> 20 #include<cmath> 21 #include<cstdlib> 22 #include<cstring> 23 #include<ctime> 24 #define LL long long 25 26 using namespace std; 27 int n ,m , c, d,k; 28 int dp[111000]; 29 int main(){ 30 scanf("%d %d %d %d %d",&c,&d,&n,&m,&k); 31 memset(dp,-1,sizeof(dp)); 32 dp[0] = 0; 33 for(int i = 0 ;i <= n*m + d;i ++) 34 { 35 if(dp[i] != -1) 36 { 37 if(dp[i+n] ==-1) 38 dp[i+n] = dp[i] + c; 39 else 40 dp[i+n] = min(dp[i+n],dp[i] +c); 41 } 42 if(dp[i] != -1) 43 { 44 if(dp[i+n] ==-1) 45 dp[i+n] = dp[i] + c; 46 else 47 dp[i+n] = min(dp[i+n],dp[i] +c); 48 if(dp[i+1] == -1) 49 dp[i+1] = dp[i] + d; 50 else 51 dp[i+1] = min(dp[i+1],dp[i] +d); 52 } 53 } 54 int mi = dp[n*m-k] ; 55 for(int i= n*m-k;i <= n*m +n ;i ++) 56 { 57 mi = min(mi,dp[i]); 58 } 59 printf("%d ",mi); 60 return 0; 61 }