先把所有可能交换出来的状态递推出来,然后贪心找一遍
重要的是不要考虑交换那个物品,要整体考虑,我当前这个状态(a)可以通过换某些东西,换到【a+1,a+d】中的某个状态
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<map>
#include<set>
#define eps 1e-9
#define PI 3.141592653589793
#define bs 1000000007
#define bsize 256
#define MEM(a) memset(a,0,sizeof(a))
#define inf 0x3f3f3f3f
#define rep(i,be,n) for(i=be;i<n;i++)
typedef long long ll;
using namespace std;
int dp[550005];
int main()
{
int n,d,c,i,j,x,flog;
scanf("%d %d",&n,&d);
dp[0]=1;//1表示i这个状态出现过,0表示没出现
for(i=0;i<n;i++)
{
scanf("%d",&c);
for(j=500000;j>=c;j--)
{
dp[j]|=dp[j-c];
}
}
int day=0;
x=0;
while(1)
{
flog=0;
for(j=x+d;j>x;j--)
{
if(dp[j])
{
flog=1;
day++;
x=j;
break;
}
}
if(!flog)
break;
}
printf("%d %d\n",x,day);
}