UVA 562 CD (DP+DFS)
2014-08-29 19:59
387 查看
01背包:
/* W w w mm mm 222222222 7777777777777 */ /* W w w w m m m m 222 22 7777 */ /* w w w w m m m m 22 777 */ /* w w w w m m m m 22 77 */ /* w w w w m m m m 222 77 */ /* w w w w m m m m 222 77 */ /* w w w w m m m m 222 77 */ /* w w w w m m m m 222 77 */ /* w w w w m m m m 222 77 */ /* ww ww m mm m 222222222222222 77 */ //#pragma comment(linker, "/STACK:102400000,102400000") #include<iostream> #include<cstdio> #include<algorithm> #include<cstring> using namespace std; int V,n,sum,m,flag; int w[25],dp[25][10005],vis[25]; void dfs(int x,int cur) { //printf("x=%d cur=%d\n",x,cur); if(!flag)return; if(x==n+1&&cur!=sum)return; if(cur==sum) { for(int i=1;i<=n;i++) { if(vis[i])printf("%d ",w[i]); } flag=0; return; } vis[x]=1; dfs(x+1,cur+w[x]); vis[x]=0; dfs(x+1,cur); } int main() { #ifdef ONLINE_JUDGE #else freopen("test.in","r",stdin); #endif while(~scanf("%d",&V)) { scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&w[i]); } memset(dp,0,sizeof(dp)); for(int i=1;i<=n;i++) { for(int j=0;j<=V;j++) { if(j<w[i]) { dp[i+1][j]=dp[i][j]; } else { dp[i+1][j]=max(dp[i][j],dp[i][j-w[i]]+w[i]); } } } memset(vis,0,sizeof(vis)); sum=dp[n+1][V]; flag=1; dfs(1,0); printf("sum:%d\n",sum); } }
相关文章推荐
- Uvalive 6259 Word equations dfs+dp
- Dividing coins - UVa 562 dp背包
- UVA624 - CD (DFS)
- UVALive5583 UVA562 Dividing coins【0/1背包+DP】
- UVA 562 Dividing coins(DP:01背包)
- UVA 562 【DP入门之01背包】
- hdu 1421 1159 1087 1160 5366 1257 light OJ 1110 uva 562 简单dp
- [UVALive 6661 Equal Sum Sets] (dfs 或 dp)
- UVA 624 CD (01背包+打印路径 或 dfs+记录路径)
- UVA624——背包DP(回溯)——CD
- UVA 562 Dividing coins(01dp)
- UVA 624 CD (DP)
- UVALive 6257 Chemist's vows --一道题的三种解法(模拟,DFS,DP)
- UVA 624 CD(01背包+dp打印路径)
- uva562(DP)
- uva 562 Dividing coins 分钱 dp
- Uva 562 背包DP
- 【DP】UVA 624 CD 记录路径
- UVA 624 CD(DP:01背包)
- UVA - 10128 Queue (DP?DFS)