uva624 CD 01背包+输出路径

来源:互联网 发布:java 统一异常处理 编辑:程序博客网 时间:2024/06/08 00:45

题意:将CD中的歌曲复制到胶卷中,胶卷最多容纳N分钟,给出CD中歌曲的数量和每一首歌的持续时间

体积和价值贡献一样大的01背包

路径输出:在选择第I件物品是从前I-1个物品这个子问题推出来的,如果f[I][j]>f[I-1][j]说明是选择了第I件物品,用一个数字path[I]记录

#include<iostream>#include<string.h>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]=f[i-1][j];else{int v1 = f[i-1][j-c[i]]+c[i];int v2 = f[i-1][j];if(v1>=v2){f[i][j] = v1;}else f[i][j] = v2;}}}int j=v;for(int i=n;i>0;i--){if(f[i][j]>f[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[n][v]<<endl;}int main(){while(cin>>v>>n){pack();}}

0 0
原创粉丝点击