DP算法入門(2)——完全揹包問題(POJ2063題解)

昨天閱讀了完全揹包問題,順便做了點題。

完全揹包問題超簡單,尤其是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;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章