问题:有一个国家发现了5座金矿,每座金矿的黄金储量不同,需要参与挖掘的工人数也不同(情况如下图)。
金矿编号 | 黄金储量 | 需要人数 |
---|---|---|
1 | 500 | 5 |
2 | 200 | 3 |
3 | 300 | 4 |
4 | 350 | 3 |
5 | 400 | 5 |
参与挖矿工人的总数是10人。每座金矿要么全挖,要么不挖,不能派出一半人挖取一半金矿。要求用程序求解出,要想得到尽可能多的黄金,应该选择挖取哪几座金矿?
代码如下:
#include<iostream>
using namespace std;
int main()
{
int n=5,w=10; //金矿数,挖矿工人总数
int p[]={0,5,3,4,3,5}; //每个矿需要的工人数
int v[]={0,500,200,300,350,400}; //每个矿的价值
int Preresult[19];
int t;
for(int i=1;i<=10;i++)
{
if(i<p[1])
{
Preresult[i]=0;
}
else
{
Preresult[i]=v[1];
}
}
int result[19]={0};
Preresult[0]=0;
for(int i=2;i<=n;i++)
{
for(int j=1;j<=w;j++)
{
//这一处理是避免因访问下标为负的元素而产生异常或者指定的存储单元意外存在数据影响最终结果
if(j-p[i]<0)
{
t=-102876;
}
else
{
t=Preresult[j-p[i]];
}
result[j]=max(Preresult[j],t+v[i]);
}
for(int k=1;k<=10;k++)
{
Preresult[k]=result[k];
}
}
cout<<result[10]<<endl;
system("pause");
return 0;
}