1. 程式人生 > 其它 >15_Java反射機制——4.反射的應用:動態代理

15_Java反射機制——4.反射的應用:動態代理

xmuoj

#include<iostream>
#include<vector>
using namespace std;
typedef long long ll;
const int N = 5e6 + 4;
ll n, V, f[N], v[N], w[N], cnt[N];

struct Node
{
	ll v, w, cnt;
};

vector<Node>p;

void work()
{
	cin >> n >> V;   //物品種類數和揹包體積
    for(int i = 1; i <= n; i++)
    {
    	ll v, w, c; cin >> v >> w >> c;  //體積,價值,數量
        if(c > 0)        //有限
        {
     		for(int k = 1; k <= c; k <<= 1)  //轉化成單個揹包,並利用可組合的性質
     		{
            	c -= k;
                p.push_back({k * v, k * w, -1}); 
            }
            if(c > 0)                       //湊不成單1,也加進去,為了湊出c
            {
            	p.push_back({c * v, c * w, -1});
            }
        }
        else p.push_back({v, w, c});   //1個或者無限
    }
  
    for(auto tmp: p)
    {
		if(tmp.cnt == -1)
		{
     		for(int k = V; k >= tmp.v; k--)
     		{
            	f[k] = max(f[k], f[k - tmp.v] + tmp.w); 
            }   
        }
        if(tmp.cnt == 0)
        {
        	for(int k = tmp.v; k <= V; k++)
        	{
            	f[k] = max(f[k], f[k - tmp.v] + tmp.w);
            }
        }    	
    }
    
    cout<<f[V];
}