UVA 624(01背包记录路径)
2015-12-10 10:58
253 查看
https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=565
记录路径可以用一个二维数组,记录改变时的量。然后从后往前可以推得所有的值。
记录路径可以用一个二维数组,记录改变时的量。然后从后往前可以推得所有的值。
#include <iostream> #include <string> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <algorithm> #include <stack> using namespace std; #define MEM(a,b) memset(a,b,sizeof(a)) #define pf printf #define sf scanf #define debug printf("!\n") #define INF 8000 #define MAX(a,b) a>b?a:b #define blank pf("\n") #define LL long long #define ep 1e-6 int dp[INF]; int way[INF][INF];//保存路径 int ci[INF];//容量 int wi[INF];//价值 int n,V,i,j,v,t,sum; void zeroOnePack(int cost,int weight) { for(v = V;v>=cost;v--) { dp[v] =MAX(dp[v],dp[v-cost]+weight); if(dp[v]==dp[v-cost]+weight) way[i][v] = 1; } } int main() { while(sf("%d",&V) && V) { MEM(dp,0); MEM(way,0); MEM(wi,0); sf("%d",&n); for(i = n;i>=1;i--)//顺序需要 { sf("%d",&wi[i]); } for(i = 1;i<=n;i++) { zeroOnePack(wi[i],wi[i]); } for(i = n,j = dp[V];i>=0,j>0;i--) { if(way[i][j]) { pf("%d ",wi[i]); j-=wi[i];//改变则检查之前wi[i]的量 } } pf("sum:%d\n",dp[V]); } return 0; }
相关文章推荐
- Swift快速入门(一)基本类型
- sql中exists,not exists的用法
- HTML DOM Table 对象
- 动态规划0-1背包问题
- 代理
- 行人检测(Pedestrian Detection)资源整合
- Codeforces 335C Sorting Railway Cars
- 键盘-App监听软键盘按键的三种方式
- [转]设计模式之六大原则——开闭原则(OCP)
- 集合取交集和差集
- android怎样调用@hide和internal API
- DNS地址栏输入网站的“域名”,而不用输入网站的“IP地址”。然后电脑系统会利用 DNS 来把“域名”翻译成“IP地址”。这个翻译的过程术语叫“域名解析/DNS解析”。原理
- html DOM操作表格及样式
- TextView的setText注意事项
- iOS应用版本更新
- Mongodb-1
- 有良好的用户体验<转>
- 【实战Java高并发程序设计 3】带有时间戳的对象引用:AtomicStampedReference
- postgres创建用户,表
- 怎样查看Office2010的安装位置