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 ...