uva624 CD 01背包+输出路径
2016-10-17 23:04
148 查看
题意:将CD中的歌曲复制到胶卷中,胶卷最多容纳N分钟,给出CD中歌曲的数量和每一首歌的持续时间
体积和价值贡献一样大的01背包
路径输出:在选择第I件物品是从前I-1个物品这个子问题推出来的,如果f[I][j]>f[I-1][j]说明是选择了第I件物品,用一个数字path[I]记录
体积和价值贡献一样大的01背包
路径输出:在选择第I件物品是从前I-1个物品这个子问题推出来的,如果f[I][j]>f[I-1][j]说明是选择了第I件物品,用一个数字path[I]记录
#include<iostream> #include<string.h> #include<algorithm> using namespace std; int f[21][2100]; int n,v; int path[21]; int c[21]; void pack() { memset(path,0,sizeof(path)); memset(f,0,sizeof(f)); for(int i=1;i<=n;i++) cin>>c[i]; for(int i=1;i<=n;i++) { for(int j=1;j<=v;j++) { if(j>=c[i]) f[i][j]=max(f[i-1][j],f[i-1][j-c[i]]+c[i]); else f[i][j]=f[i-1][j]; } } int j=v; for(int i=n;i>0;i--) { if(f[i][j]>f 4000 [i-1][j])//在顺推时 考察第i是放还是不放是从前一个状态推出来的,如果放入i时大,说明放入了i,否则没放和前一个状态一样 { path[i]=1; j = j - c[i];//减去放入i的体积,回到没放i的状态,继续倒推 } } for(int i=0;i<=n;i++) if(path[i]==1)cout<<c[i]<<" "; cout<<"sum:"<<f [v]<<endl; } int main() { while(cin>>v>>n) { pack(); } }
相关文章推荐
- CD-----UVa624(01背包+输出路径)
- uva624 - CD(01背包+打印路径)
- uva624 CD (01背包+路径的输出)
- UVa 624 CD (01背包路径输出)
- UVA 624 CD(01背包+dp打印路径)
- UVA 624 CD 01背包 输出解
- uva 624 CD(01背包问题)输出最小字典序是个问题虽然题目不要求
- uva 624 CD (01背包+打印路径)
- UVA 624 CD(打印路径的01背包)
- CD - UVa 624 01背包记录路径
- UVA 624 CD(01背包+记录路径)
- UVA 624 CD(01背包/记录路径)
- UVA624 CD,01背包+打印路径,好题!
- UVA 题目624 CD(01背包输出路径啊)
- Hrbust 1836 2012世界末日【01背包+反路径输出】
- UVA 624 CD (01背包 带路径)
- UVA - 624 CD(01背包+路径纪录)
- Uva-624 CD (需要输出方案的01背包)
- 01背包路径输出
- UVA 624 CD ( 01背包 + 逆推路径)