摘要: 至少一种 至多一种 还有自由选取的背包问题参考别人的- -不说了#include #include #include #include using namespace std; int n, T, ans, dp1[105], dp2[105]; struct node { int m, tp; int t[105], h[105]; } set[105]; bool cmp(node x,node y) { return x.tp=set[i].t[j]; k--) { dp2[k]=max(dp... 阅读全文
posted @ 2013-08-24 09:57 Ink_syk 阅读(116) 评论(0) 推荐(0) 编辑
摘要: 可以把每行看做是最多挑一个的物品系列,然后背包过。。#include #include #include #include using namespace std; int dp[105], v[105][105]; int main() { int n, m, i, j, k, w; while(scanf("%d%d",&n,&m)!=EOF) { if(n==0&&m==0) break; memset(dp,-63,sizeof(dp)); dp[0]=0; for(i=0;i=0;j--) ... 阅读全文
posted @ 2013-08-24 09:43 Ink_syk 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 这题乍一看是01背包水题,其实一看数据,明显直接01背包是过不了的, 再看那个V-C的范围是0-10 很明显,可能的搭配数最多也就121种那么我就开一个数组记录下各种搭配的数量,用多重背包过#include #include #include #include using namespace std; int dp[10005]; char s[15]; int v, c, data[11][11], m; void deal(int vi,int w,int num) { int i, j, k; k=1; while(k=k*w;j--) ... 阅读全文
posted @ 2013-08-24 09:03 Ink_syk 阅读(84) 评论(0) 推荐(0) 编辑
摘要: 最短路径+01背包。。#include#include#include#include#includeusing namespace std;const int INF=1=dis[i];j--) { dp[j]=max(dp[j],dp[j-dis[i]]+po[i]); } } int ans; bool f=false; for(i=0;isum/2) { ans=i; f=tr... 阅读全文
posted @ 2013-08-22 20:04 Ink_syk 阅读(140) 评论(0) 推荐(0) 编辑
摘要: 难点在于用并查集求与根节点的距离并更新吧。。 遇到过好几次了#include#include#include#include#includeusing namespace std;int n, q, fa[10005], num[10005], cou[10005];void init(){ int i; for(i=1; i<=n; i++) fa[i]=i, num[i]=1, cou[i]=0;}int find(int x){ if(x==fa[x]) return x; int tmp=fa[x]; fa[x]=find(fa[x]); ... 阅读全文
posted @ 2013-08-22 19:55 Ink_syk 阅读(118) 评论(0) 推荐(0) 编辑
摘要: 很有技巧的并查集 参考了别人的#include #include #include using namespace std; int high[30005], fa[30005], top[30005], ret[30005]; void init() { int i; for(i=0; i=0;i--) { high[ret[i]]+=high[fa[ret[i]]]; fa[ret[i]]=id; } return id; } int main() { int p, x, y, a, b; char o... 阅读全文
posted @ 2013-08-20 15:48 Ink_syk 阅读(132) 评论(0) 推荐(0) 编辑
摘要: 并查集 过了#include #include #include using namespace std; bool pipe[][4]= {1,1,0,0, 0,1,1,0, 1,0,0,1, 0,0,1,1, 0,1,0,1, 1,0,1,0, 1,1,1,0, 1,1,0,1, 1,0,1,1, ... 阅读全文
posted @ 2013-08-20 15:43 Ink_syk 阅读(97) 评论(0) 推荐(0) 编辑
摘要: 将Xiaoqian可付的钱的值用多重背包的方式计算拼凑起来所需的最小硬币数,用完全背包的方式计算找钱的值的拼凑最小硬币数。然后再寻找最小值。#include#include#include#includeusing namespace std;int dp1[20005], dp2[20005], t, v[105], r[105];const int INF=1=20000) { for(i=v[x];i=k*v[x];i--) dp1[i]=min(dp1[i],dp1[i-k*v[x]]+k); r[x]-=k; ... 阅读全文
posted @ 2013-08-19 19:06 Ink_syk 阅读(118) 评论(0) 推荐(0) 编辑
摘要: 在完全背包的基础上再多一维就好了#include#include#include#includeusing namespace std;int v[105], r[105];int dp[105][105]; //忍耐度,杀怪数int main(){ int n, i, j, k, s, m, l; while(scanf("%d%d%d%d",&n,&m,&k,&s)!=EOF) { memset(dp,0,sizeof(dp)); for(i=0;i=n) { ans=dp[i... 阅读全文
posted @ 2013-08-19 19:02 Ink_syk 阅读(145) 评论(0) 推荐(0) 编辑
摘要: 意思是将物品尽量分成价值相近的两部分,那么就总价值除以2,然后就是多重背包的做法#include#include#include#includeusing namespace std;int v[55], r[55], m;bool dp[130000];void deal(int x){ int i; if(v[x]*r[x]>=m) { for(i=v[x];i=k*v[x];i--) if(dp[i-k*v[x]]) dp[i]=true; r[x]-=k; k*=2; ... 阅读全文
posted @ 2013-08-19 18:59 Ink_syk 阅读(110) 评论(0) 推荐(0) 编辑