分硬币
2006-10-31 15:59 老博客哈 阅读(490) 评论(0) 编辑 收藏 举报/*http://acm.hnu.cn:8080/online/?action=problem&type=show&id=10415*/
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
int main()
{
int m; //硬币数目
int v[100]; //硬币面值
bool isIn[50001]; //硬币额度存在,则设置为true
vector<int> num; //所有能够获取的面额
int i, j;
while(cin >> m)
{
int total = 0;
for(i = 0; i < m; i++)
{
cin >> v[i];
total += v[i];
}
memset(isIn, false, sizeof(isIn));
num.clear();
num.push_back(0);
for(i = 0; i < m; i++)
{
int length = num.size();
for(j = 0; j < length; j++)
{
if(!isIn[ v[i] + num[j] ])
{
isIn[ v[i] + num[j] ] = true;
num.push_back(v[i] + num[j]);
}
}
}
for(i = total / 2; i >= 0; i--)
{
if(isIn[i])
{
cout << total - i - i << endl;
break;
}
}
}
return 0;
}
不要轻易认为就是Greedy了哈
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
int main()
{
int m; //硬币数目
int v[100]; //硬币面值
bool isIn[50001]; //硬币额度存在,则设置为true
vector<int> num; //所有能够获取的面额
int i, j;
while(cin >> m)
{
int total = 0;
for(i = 0; i < m; i++)
{
cin >> v[i];
total += v[i];
}
memset(isIn, false, sizeof(isIn));
num.clear();
num.push_back(0);
for(i = 0; i < m; i++)
{
int length = num.size();
for(j = 0; j < length; j++)
{
if(!isIn[ v[i] + num[j] ])
{
isIn[ v[i] + num[j] ] = true;
num.push_back(v[i] + num[j]);
}
}
}
for(i = total / 2; i >= 0; i--)
{
if(isIn[i])
{
cout << total - i - i << endl;
break;
}
}
}
return 0;
}