牛客训练营3-智乃买瓜(anthor version) dp还原为原背包

题目描述

已经知道购买质量为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]<<" ";
}

上一篇:luogu P5406 [THUPC2019]找树


下一篇:Azkaban进阶之JavaProcess任务类型