地址:http://codeforces.com/problemset/problem/365/D
思路:贪心,思想十分巧妙(只可意会不可言传QAQ),先将所有能够到达的状态先做标记,在从sum=0开始每次取 (sum,sum+d]的最大状态,同时记录搜索次数s,这样到搜索不到时,sum,s即为答案。
Code :
#include<iostream>
#include<cstring>
using namespace std;
const int MAX_S=500005;
int n,m;
int dp[MAX_S];
int main()
{
ios::sync_with_stdio(false);
while(cin>>n>>m){
memset(dp,0,sizeof(dp));
dp[0]=1;
for(int i=1,x;i<=n;++i)
{
cin>>x;
for(int i=MAX_S;i>=x;--i)
if(dp[i-x]) dp[i]=1;
}
int sum=0,ans=0,p=1;
while(p){
p=0;
for(int i=sum+m;i>sum;--i)
if(dp[i]){
sum=i; ++ans;
p=1; break;
}
}
cout<<sum<<" "<<ans<<endl;
}
return 0;
}