最佳课题选择
这是一道多重背包问题
仍记得当时写出来死命debug的过程
然而最后发现没开long long导致只过两组
只考虑给当前分配多少和给前面所有的东西分配多少就可以
上代码
#include <cstdio>
#include <cstring>
#include <iostream>
#define LL long long
using namespace std;
const int Maxn=201;
LL n,m,a[Maxn],b[Maxn],sum[Maxn],f[Maxn][Maxn];
LL pow(LL x,LL n)
{
LL c=1;
for(int i=1;i<=n;i++)c*=x;
return c;
}
int main()
{
memset(f,1,sizeof(f));
scanf("%lld%lld",&n,&m);
for(int i=1;i<=m;i++)
scanf("%lld%lld",&a[i],&b[i]);
for(int i=0;i<=n;i++)f[0][i]=0;
for(int i=0;i<=m;i++)f[i][0]=0;
for(int i=1;i<=n;i++)f[1][i]=a[1] * ( pow(i,b[1]) );
for(int i=2;i<=m;i++)
for(int j=1;j<=n;j++)
for(int k=0;k<=j;k++){
if(f[i-1][j-k] + a[i] * ( pow(k,b[i]) )<f[i][j]){
sum[i]=k;
f[i][j]=f[i-1][j-k] + a[i] * ( pow(k,b[i]) );
}
}
cout<<f[m][n];
}欢迎指出Bug
End。

本文介绍了一个经典的多重背包问题实例,并提供了详细的代码实现。通过分析如何为每个子问题找到最优解来解决整体问题,展示了递归求解过程及注意事项。
401

被折叠的 条评论
为什么被折叠?



