PAT Advanced Level 1068

来源:互联网 发布:警告本网站域名在美国 编辑:程序博客网 时间:2024/05/29 02:18

题目地址:http://pat.zju.edu.cn/contests/pat-a-practise/1068

思路分析:DP

解题感悟:参考网络大神的代码,感觉自己弱爆了

代码如下:

#include <iostream>#include <fstream>#include <algorithm>#include <cstring>#include <vector>using namespace std;//ifstream fin("C:\\Users\\Devon\\Desktop\\input.txt");//#define cin fin#define MAXTOTAL10001#define MAXAMOUNT101int f[MAXTOTAL][MAXAMOUNT];bool has[MAXTOTAL][MAXAMOUNT];int* c=NULL;int calcClosestSum(int n,int m){memset(f,0,sizeof(int)*MAXTOTAL*MAXAMOUNT);memset(has,false,sizeof(bool)*MAXTOTAL*MAXAMOUNT);int i,j;int sec;for(i=1;i<n+1;i++){for(j=1;j<=m;j++){if(j-c[i]<0)sec=0;else sec=f[i-1][j-c[i]]+c[i];if(f[i-1][j]>sec) f[i][j]=f[i-1][j];else{f[i][j]=sec;has[i][j]=true;}}}return f[n][m];}bool cmp(const int& A,const int& B){return A>B;}int main(){   int n,m;   cin>>n>>m;   c = new int[n+1];   memset(c,0,sizeof(int)*(n+1));   int i;   for(i=0;i<n;i++) cin>>c[i+1];   sort(&c[1],&c[n+1],cmp);   int res=calcClosestSum(n,m);   if(res==m){vector<int> v;while(m){while(!has[n][m]) n--;v.push_back(c[n]);m=m-c[n];n--;}for(i=0;i<v.size()-1;i++) cout<<v[i]<<' ';cout<<v[i]<<endl;   }   else cout<<"No Solution"<<endl;   return 0;}


0 0
原创粉丝点击