View Code
//fafu 1001 dp(背包) //题意是 n 个人花一定量的钱 在m道菜中各选一道菜(都选不同的) //要求选完后能够花尽量多的钱 //这题其实就是背包问题,具体看代码 #include <stdio.h> #include <string.h> #define N 1005 #define M 55 int n_pers, n_meal, money; int cost[M], dp[N], cnt[M]; bool cmp(int a, int b) { if(a > b) return true; return false; } int main() { while(scanf("%d%d%d", &n_pers, &n_meal, &money) != EOF) { for(int i = 0; i < n_meal; ++i) scanf("%d", &cost[i]); //dp数组下标表示 花的钱数,值表示点几道菜 memset(dp, -1, sizeof(dp)); int ans = 0; dp[0] = 0; for(int i = 0; i < n_meal; ++i) //点第 i 道菜 { for(int j = money; j >= cost[i]; --j) { int index = j-cost[i]; if(dp[index] >= 0 && dp[index] + 1 <= n_pers) { //若之前有花 j-cost[i] 这么多,则 可以到达j 这一状态 //而且 j-cost[i] 这一状态所点的菜 再加上i 这道菜 不会超过总人数 if(dp[j] == -1 || dp[j] > dp[index] + 1 ) { if(ans < j) ans = j; //记录最大花费 dp[j] = dp[index] + 1; } } } } printf("%d\n", ans); } return 0; }