这题,我用搜索写,超时了,,70分,数据太大了真坑,,
不说了都是泪,转载一手满分代码,,
转自:
http://www.cnblogs.com/cao-lei/p/7218782.html
#include<iostream>
using namespace std;
#define MAX_NUM 100000
int n;
int goods[11]; //保存物品的体积
int volume[MAX_NUM]; //保存物品能组成的所有体积
int gcd(int a,int b) //求两个数的最大公约数
{
if (a % b == 0)
return b;
else
return gcd(b, a % b);
}
int gcdAll() //求所有数的最大公约数
{
int temp = goods[0];
for (int i = 1; i < n; i++)
{
temp = gcd(temp, goods[i]);
}
return temp;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
cin >> goods[i];
if (gcdAll() == 1) //如果所有数的最大公约数为1,则有解,否则为无限解
{
volume[0] = 1;
for (int i = 0; i < n; i++)
{
for (int j = goods[i]; j <= MAX_NUM; j++)
{
if (volume[j - goods[i]] == 1) //i=0时,j为goods[0]的倍数;
//接下来,j为 goods[i]中物品体积值组合的结果
volume[j] = 1;
}
}
for (int i = MAX_NUM; i >= 0; i--) //逆序遍历所有的体积结果,将第一个不能组合的数输出后结束
{
if (!volume[i])
{
cout<<i;
return 0;
}
}
}
cout<<"0"; //无限解
return 0;
}