【发布时间】:2015-02-27 23:13:39
【问题描述】:
我们有一个由 n 个正整数组成的数组。一个可接受的举措是将所有元素增加 1 或 2 或 5,但一个元素除外。我们需要找出使所有数组元素相等的最小操作数。
经过搜索,我发现了一种方法:
- 找出非最小元素与最小元素之间的所有差异。
- 通过使用硬币找零方法,找出为所有差异提供找零所需的最小硬币数量。
- 返回所有这些最小硬币数量的总和。
但是这种方法对于这个测试用例失败了:
数组:1,5,5
最少操作数:3 (1,5,5 -> 1,6,6 -> 6,6,11 -> 11,11,11)。
按照上述方法,我得到了 4。
有人可以提出正确的方法吗?
这是我的源代码:
#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <algorithm>
#include <climits>
using namespace std;
int input[10000];
int input1[10000];
int dp[4][1001];
int parent[4][1001];
int coins[4]={0,1,2,5};
int operation=0;
int main() {
int t,n,i,j,count,sum,diff,prevdiff,min;
for(i=1;i<1001;i++)
{
dp[0][i]=INT_MAX;
parent[0][i]=INT_MAX;
}
for(i=0;i<4;i++)
{
dp[i][0]=0;
parent[i][0]=-1;
}
for(i=1;i<1001;i++){
for(j=1;j<4;j++){
dp[j][i]=dp[j-1][i];
parent[j][i]=parent[j-1][i];
if(i>=coins[j]&&dp[3][i-coins[j]]<INT_MAX){
if(dp[3][i-coins[j]]+1<dp[j][i]){
dp[j][i]=dp[3][i-coins[j]]+1;
parent[j][i]=j;
}
}
}
}
cin>>t;
while(t>0){
cin>>n;
min=INT_MAX;
for(i=0;i<n;i++)
{
cin>>input[i];
if(input[i]<min){
min=input[i];
}
//input1[i]=input[i];
}
//sort(input,input+n);
count=0;
sum=0;
for(i=0;i<n;i++){
count=count+dp[3][input[i]-min];
}
cout<<count<<endl;
t--;
}
/*
for(i=1;i<1001;i++){
if(dp[3][i]!=minCoins(i))
cout<<dp[3][i]<<" "<<minCoins(i)<<endl;
}
*/
return 0;
}
【问题讨论】:
-
能否请您发布到目前为止您尝试过的相关代码,以便容易理解是否存在任何错误?
-
你能提供你找到的方法的链接吗?我认为如果您只有元素 1,该方法有效,但如果您有元素 1、2 和 5,则该方法无效。
标签: c++ algorithm dynamic-programming