n*m物品取若干件附代价问最少代价(dp)

题:https://ac.nowcoder.com/acm/contest/6877/A

题意:店每天有m个物品,每个物品都有代价c,现有n天,你每天要用一件。问要如何购买代价最小。且在一天中购买k件会增加代价k^2。

分析:设dp[i][j]表示第 i 天购买了 j 个物品的最小代价,dp[i][j]可由前i-1天买了x个物品(x<=j)加上第 i 天买了j-x个物品转化而来。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
#define pb push_back
#define lson root<<1,l,midd
#define rson root<<1|1,midd+1,r
const int inf=0x3f3f3f3f;
const ll INF=1e18;
const int M=305;
const int mod=998244353;
ll a[M][M],dp[M][M];
int main(){
    int n,m;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++){
        for(int j=1;j<=m;j++)
            scanf("%lld",&a[i][j]);
        sort(a[i]+1,a[i]+1+m);
        for(int j=1;j<=m;j++)
            a[i][j]+=a[i][j-1];
    }
    memset(dp,0x3f,sizeof(dp));
    dp[0][0]=0;
    for(int i=1;i<=n;i++)
        for(int j=i;j<=min(n,i*m);j++){
            for(int k=0;k<=j&&k<=min(n,(i-1)*m);k++)
                dp[i][j]=min(dp[i][j],dp[i-1][k]+a[i][j-k]+(j-k)*(j-k));
        }
    printf("%lld
",dp[n][n]);
    return 0;
}
View Code
原文地址:https://www.cnblogs.com/starve/p/13438317.html