题目描述
已经知道购买质量为1 2 3 .....m的瓜的方案数,对于每一个瓜,我们可以选择买整个,买半个,不买。保证每个瓜质量为偶数。
思路:
这道题的的原版本是已知道每个瓜的质量求方案数,直接进行背包即可。对于这道题是他的逆向求解,我们从小到大枚举每一个方案数,如 样例 1 2 1 3 2 1,说明买质量为1的瓜方案数有1,这就说明一定有一个瓜质量为2切一半后达到这个方案数,于是我们将2加入答案序列,并对样例消除2这个瓜后进行更新。
代码
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod=1e9+7;
signed main(){
int cnt=0,ans[1010];
int m,a[1010];
cin>>m;
for(int i=1;i<=m;i++)cin>>a[i];
a[0]=1;
for(int i=1;i<=m;i++){
while(a[i]){
ans[++cnt]=2*i;
for(int j=i;j<=m;j++){
if(j-ans[cnt]>=0)a[j]=(a[j]-a[j-ans[cnt]]-a[j-ans[cnt]/2]+mod)%mod;
else a[j]=(a[j]-a[j-ans[cnt]/2]+mod)%mod;
}
}
}
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++)cout<<ans[i]<<" ";
}