题意:
小明买了n件商品,付钱的时候他可以划分k次付款,每次付款最后一位数都会四舍五入,比如95就是付款100,问在最多划分k次且不改变序列的情况下 ,我们能得到的最小花费
解题思路:
定义dp[i][j]为到第i位的商品划分j次产生的最小花费,
我们枚举划分1到k次的情况,在每最多划分j次的状态,且我们已知划分j-1次的答案,我们就可以枚举的j次划分在哪个位置上,从而得到答案.
转移方程就是dp[i][j]=min(dp[i-1][j]+a[i], (dp[i-1][j-1]+5)/10*10).
代码:
#include <bits/stdc++.h>
using namespace std;
const int maxn=1e4;
const int inf=20000000;
int a[maxn];
int dp[maxn][22];
int main()
{
int i, j, n, d;
while(~scanf("%d%d", &n, &d))
{
memset(dp, 0, sizeof dp);
for(i=1; i<=n; i++)
{
scanf("%d", &a[i]);
dp[i][0]+=a[i]+dp[i-1][0];
// book[b[i]]++;
}
int x, y;
for(j=1; j<=d; j++)
{
for(i=1; i<=n; i++)
{
dp[i][j]=inf;
if(dp[i-1][j])
{
dp[i][j]=min(dp[i-1][j]+a[i], dp[i][j]);
}
if(dp[i-1][j-1])
{
dp[i][j]=min(dp[i][j], (dp[i-1][j-1]+5)/10*10+a[i]);
}
}
}
int ans=inf;
for(i=0; i<=d; i++)ans=min(ans, (dp[n][i]+5)/10*10);
printf("%d\n", ans);
}
}