uva 624 CD

来源:互联网 发布:凯迪网络社区官网 编辑:程序博客网 时间:2024/06/07 02:38
//题目大意:你有一个CD和一个磁带,你想要把CD里面的歌曲拷贝到磁带中。但是磁带容量有限,要求你尽量选择歌曲使得磁带中剩余容量最小。
//思路见下端
#include<iostream>#include<algorithm>#include<cstdio>#include<vector>#include<cstring>#include<string>using namespace std;int dp[21][100000];int max(int x,int y){if(x>y)return x;return y;}struct cds{int num,lon;};cds cd[21];vector<cds> ve;bool cmp(const cds &a,const cds &b){return a.num<b.num;}int main(){ios::sync_with_stdio(false);int n,v,ans,i,j;while(cin>>v>>n){ve.clear();memset(dp,0,sizeof(dp));for(i=1;i<=n;i++){cin>>cd[i].lon;cd[i].num=i;}for(i=1;i<=n;i++)//01背包{for(j=1;j<=v;j++){if(j>=cd[i].lon)dp[i][j]=max(dp[i-1][j],dp[i-1][j-cd[i].lon]+cd[i].lon);elsedp[i][j]=dp[i-1][j];}}ans=dp[n][v];j=v,i=n;while(i>0&&j>0)//打印路径{if(dp[i][j]==dp[i-1][j-cd[i].lon]+cd[i].lon){ve.push_back(cd[i]);j=j-cd[i].lon;}i--;}sort(ve.begin(),ve.end(),cmp);for(i=0;i<ve.size();i++)cout<<ve[i].lon<<" ";cout<<"sum:"<<ans<<endl;}return 0;}<div style="text-align: center;"></div>
//有题目可知,就是简单的01背包+打印路径,不过路径要用编号存储起来,然后排序打印出

0 0
原创粉丝点击