昨天閱讀了完全揹包問題,順便做了點題。
完全揹包問題超簡單,尤其是O(VN)的算法,很容易就能懂,把01揹包的第二重循環倒過來即可。
2063這題就是按年走,每年根據當前的餘額使用完全揹包算出最大獲利加到餘額上,沒什麼可說的,注意都要除以1000,memset慎用,附屬代碼:
#include <cstdio>
#include <string.h>
#include <algorithm>
using namespace std;
const int NMax=50,VMax=5000000;
int V,Y,N,C[NMax],W[NMax],F[VMax];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&V,&Y);
scanf("%d",&N);
for(int i=1;i<=N;i++)
{
scanf("%d%d",&C[i],&W[i]);
C[i]/=1000;
}
for(int i=1;i<=Y;i++)
{
for(int j=0;j<=V/1000;j++) F[j]=0;
for(int j=1;j<=N;j++)
for(int k=C[j];k<=V/1000;k++)
F[k]=max(F[k],F[k-C[j]]+W[j]);
V+=F[V/1000];
}
printf("%d\n",V);
}
return 0;
}