Sample Input
5 1
13 21 55 60 42
5 2
1 1 1 1 1
Sample Output
190
0
题意:一个人买了N件物品,最多可以分d次付款,付款遵循四舍五入原则,即如果14块,那么只用付10元,如果15块,那么要付20元。问怎么分配付款能让付的钱总数最小。
思路:一种DP隔板的方式。
#include <iostream>
#include <stdio.h>
#include <string>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
int dp[2222][22],sum[2222];
int main()
{
int n,d;
while(~scanf("%d%d",&n,&d))
{
sum[0]=0;
int a;
for(int i=1;i<=n;i++)
{
scanf("%d",&a);
sum[i]=sum[i-1]+a;
}
memset(dp,0x3f3f,sizeof dp);
for(int i=1;i<=n;i++)
{
dp[i][0]=(sum[i]+5)/10*10;//实现四舍五入
for(int j=1;j<i;j++)
{
for(int k=1;k<=d;k++)
{
dp[i][k]=min(dp[i][k],dp[j][k-1]+(sum[i]-sum[j]+5)/10*10);
}
}
}
int ans=9999999999;
for(int i=0;i<=d;i++)
{
ans=min(ans,dp[n][i]);
}
printf("%d\n",ans);
}
return 0;
}