题意:输入n,m,k代表n天,每天m节课,每天要从第一节课待到最后一节课结束,n天一共可以逃k节课,问最少在学校待多久?
题解:每天逃课节数和n天的上限的最小价值,也就是背包,这里是分组背包,每天逃课的节数作为物品,也就是n组只能选件物品,每天必须选一件
dp[i][j]代表前i天逃j节课的最小价值
#include <bits/stdc++.h> #define maxn 510 #define INF 0x3f3f3f3f using namespace std; int n, m, k, a[maxn], c[maxn][maxn], dp[maxn][maxn]; char s[maxn]; int main(){ scanf("%d%d%d", &n, &m, &k); for(int i=1;i<=n;i++){ scanf("%s", s); int num = 0; for(int j=0;j<m;j++){ if(s[j] == '1') a[++num] = j; } for(int j=0;j<num;j++){ c[i][j] = a[num]-a[1]+1; for(int l=0;l<=j;l++){ c[i][j] = min(c[i][j], a[num-j+l]-a[l+1]+1); } } c[i][num] = 0; } memset(dp, INF, sizeof(dp)); dp[0][0] = 0; for(int i=1;i<=n;i++){ for(int j=0;j<=k;j++){ for(int l=0;l<=j;l++){ dp[i][j] = min(dp[i][j], dp[i-1][j-l]+c[i][l]); } } } printf("%d ", dp[n][k]); return 0; }