n个金矿,共有w个工人(目前可以用的人数),F收益
F(n,w)
//递推函数
//n个金矿,共有w个工人(目前可以用的人数),F收益
//F(n,w)
//那么该问题的边界值如下:
//
//当w=0且w<p[0],则F(1,w)=0 当目前人数为0,且小于第一个矿的所需工人数目,此时获益为0
//当w=0且w>p[0],则F(1,w)=g[0] 当目前人数为0,但大于第一个矿的所需工人数目,此时获益为第一个矿产数
#include<bits/stdc++.h>
using namespace std;
int getVal(int n, int w, int g[], int p[])
{
int res[n + 1][w + 1];
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= w; j++)
{
res[i][j] = 0;
}
}
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= w; j++)
{
cout<<res[i][j]<<" ";
}
cout<<endl;
}
for (int i = 1; i <= n; i++)
{
for (int j = 1; j <= w; j++)
{
//当当前人数不满足于挖当前矿,为什么pg都要i-1,因为它们是从0开始存储的
if (j < p[i-1])
res[i][j] = res[i-1][j];
else
res[i][j] = max(res[i-1][j],res[i-1][j-p[i-1]]+g[i-1]);
}
}
for(int i = 0; i <= n; i++)
{
for(int j = 0; j <= w; j++)
{
cout<<res[i][j]<<" ";
}
cout<<endl;
}
return res[n][w];
}
int main()
{
int g[5] = {400, 500, 200, 300, 350};
int p[5] = {5, 5, 3, 4, 3};
int ans = getVal(5, 10, g, p);
cout<<ans;
return 0;
}