흑과학기술: 다중 가방 최적화

4710 단어
흑과학기술의: 다중 가방 최적화
최적화 방법 1: 바이너리 최적화
사상: v[i]개 물품을 1, 2, 4,...2^k, 나머지, 그리고 01 가방
코드:
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include <set>
#include 
#include <string>
#include 
#include 
using namespace std;
#define rep(i,x,y) for(int i=x;i<=y;i++)
#define frep(i,x,y) for(int i=x;i>=y;i--)
#define ll long long
struct bag
{
    int v;
    int w;
};
const int N=10000005;
int n;
ll t;
ll val[N],w[N];
int cnt=0;
bag a[N];
ll f[N];
ll ans=0;
int main()
{
    scanf("%d%lld",&n,&t);
    rep(i,1,n)
    {
        ll W;
        scanf("%lld%lld%lld",&val[i],&w[i],&W);
        for(ll j=1;j<=W;j<<=1)
        {
            cnt++;
            a[cnt].v=val[i]*j;
            a[cnt].w=w[i]*j;
            W-=j;
        }
        if(W)
        {
            cnt++;
            a[cnt].v=val[i]*W;
            a[cnt].w=w[i]*W;
        }
    }
    n=cnt;
    rep(i,1,n)
    {
        frep(j,t,a[i].w)
        {
            f[j]=max(f[j],f[j-a[i].w]+a[i].v);
        }
    }
    rep(i,0,t) ans=max(ans,f[i]);
    printf("%lld
",ans); return 0; }

최적화 방법2: 단조로운 대기열 최적화
할 줄 모르다
최적화 방법 3: 신기한 최적화
같은 종류에 출현 횟수>2의 수
두 개를 합쳐서.
끝까지 병합, 끝
예:

P3563 [POI2013]POL-Polarization

좋은 웹페이지 즐겨찾기