POJ 多重揹包專題

2021-08-26 08:01:23 字數 4314 閱讀 6950

poj 1014 dividing

這道題用揹包做有兩種解法,一種是拆分法,另一種是很神的o(vn)的dp法。

拆分法:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define maxn 10005

#define inf 100000000

#define eps 1e-11

#define l(x) x<<1

#define r(x) x<<1|1

using namespace std;

int f[240005], v;

void complete_pack(int *a, int c, int w)

void zeroone_pack(int *a, int c, int w)

void mutiple_pack(int *a, int c, int w, int m)

int k = 1;

while(k < m)

zeroone_pack(a, c * m, w * m);

}int main()

printf("collection #%d:\n", ++cas);

if(sum & 1)

else

else}}

return 0;

}

然後是o(vn)的方法,因為本題是一種揹包的可行性問題,所以才能用這種方法。

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define maxn 10005

#define inf 100000000

#define eps 1e-11

#define l(x) x<<1

#define r(x) x<<1|1

using namespace std;

int f[240005], v, used[240005];

int main()

printf("collection #%d:\n", ++cas);

if(sum & 1)

else}}

if(f[sum])

else

puts("can't be divided.\n");}}

return 0;

}

poj 1742coins

很裸的揹包可行性問題

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define maxn 10005

#define inf 100000000

#define eps 1e-11

#define l(x) x<<1

#define r(x) x<<1|1

using namespace std;

bool f[100005];

int used[100005];

int main()}}

printf("%d\n", sum);

}return 0;

}

poj 2392 space elevator

這個題的多了乙個限制條件,實際上只要按限制條件從小到大排序就行

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define maxn 10005

#define inf 100000000

#define eps 1e-11

#define l(x) x<<1

#define r(x) x<<1|1

using namespace std;

struct wwj

p[405];

bool f[400005];

int used[400005];

bool cmp(wwj x, wwj y)

int main()

sort(p + 1, p + k + 1, cmp);

memset(f, 0, sizeof(f));

f[0] = 1;

int ans = 0;

for(i = 1; i <= k; i++)}}

printf("%d\n", ans);

return 0;

}

poj 1276cash machine

裸題不解釋

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define maxn 10005

#define inf 100000000

#define eps 1e-11

#define l(x) x<<1

#define r(x) x<<1|1

using namespace std;

bool f[100005];

int used[100005];

int main()}}

printf("%d\n", ans);

}return 0;

}

poj 3211washing clothes

其實就是個0-1揹包變形,對同種顏色的衣服,把乙個人洗所有衣服的時間算出來,除以二,然後看能達到的最大容量,這就可以保證兩人的洗衣時間盡量平均了。也可以用多重揹包的做法做,只要把件數都設成1就行。

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define maxn 10005

#define inf 100000000

#define eps 1e-11

#define l(x) x<<1

#define r(x) x<<1|1

using namespace std;

bool f[50005];

int v[11][101], cnt[11];

int main()

for(i = 1; i <= m; i++)

int ans = 0;

int mx;

for(i = 1; i <= n; i++)

}/* 多重揹包做法

for(k = 0; k <= sum / 2; k++)

used[k] = 0;

for(k = v[i][j]; k <= sum / 2; k++)}*/

}ans += (sum - mx);

}printf("%d\n", ans);

} return 0;

}

POJ 多重揹包專題

poj 1014 dividing 這道題用揹包做有兩種解法,一種是拆分法,另一種是很神的o vn 的dp法。拆分法 include include include include include include include include include include include inc...

POJ1014 多重揹包

今天開始dp了,第一道多重揹包,模板題,還是想了很久,太弱了 題意 一行給出6個數,表示從1到6,6個不同權值的個數.求能否將所有權值不分割的分成權值相等的兩份.首先總權值為奇數的肯定不符合要求,接下來就是乙個多重揹包了.多重揹包的二進位制拆分我的理解大概是 首先將乙個數按二進位制拆分之後可以用拆分...

poj1276 多重揹包

題意 取款機的問題 有 n 種錢 每種錢有 v i 的價值 每種錢有 w i 張 問給定要取得錢 cash 之後能從取款機最多取多少錢 理解 多重揹包 直接套模板 遞推式 dp i max dp i dp i mul v i mul v i 其中的值根據 定義 如下 include include ...