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
- PAT Advanced Level 1068
- PAT Advanced Level 1077
- PAT Advanced Level 1078
- PAT Advanced Level 1079
- PAT Advanced Level 1080
- PAT Advanced Level 1010
- PAT Advanced Level 1016
- PAT Advanced Level 1018
- PAT Advanced Level 1039
- PAT Advanced Level 1060
- PAT Advanced Level 1026
- PAT Advanced Level 1029
- PAT Advanced Level 1030
- PAT Advanced Level 1033
- PAT Advanced Level 1034
- PAT Advanced Level 1038
- PAT Advanced Level 1045
- PAT Advanced Level 1049
- tab面板是否存在
- JAVA轻量级文件监控
- Eclipse 集成Hibernate Tool工具
- 九月十月百度人搜,阿里巴巴,腾讯华为小米搜狗笔试面试八十题
- 算法:从序列里找到最长的以1降序的子序列
- PAT Advanced Level 1068
- MFC截图程序的实现(十一)
- PHP 程序员学数据结构与算法之《栈》
- fcntl和select函数彻底搞明白
- Effective C++:条款21:必须返回对象时别妄想返回其reference
- HDU1236 排名 题解
- “ASP.default_aspx”并不包含“DropDownList1_SelectedIndexChanged”的定义,其解决方法。
- hdu1815 2sat + 二分 + 建图<不错的题目>
- 手机变砖进入sw模式刷bin的问题