题意:
有一个
n
个正数的序列
求出序列 A 。
分析:
这道题可以正着推也可以倒着推。
正着推:
所谓正着推,就是一步步模拟出来
那么,如何利用这个过程来求出
至此,思路彻底理清楚。那么如何更新
f
呢?就是背包的思想,想知道用上
倒着退:
如果
代码:
#include <iostream>
#include <algorithm>
#include <queue>
#include <stack>
#include <vector>
#include <set>
#include <cmath>
#include <cstdlib>
#include <cstring>
#include <cstdio>
using namespace std;
#define ms(a,b) memset(a,b,sizeof(a))
typedef long long ll;
const int MAXN=1e4+5;
const double EPS=1e-8;
const int INF=0x3f3f3f3f;
int b[MAXN],ans[MAXN],f[MAXN],n,m;
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=0;i<=m;i++){
scanf("%d",&b[i]);
f[i] = 0;
}
int tot = 0;
f[0] = 1;
for(int i=1;i<=m;i++){
int num = b[i] - f[i];
if(tot == n) break;
for(int j=0;j<num;j++){
ans[tot++] = i;
for(int k=m;k>=i;k--){
f[k] += f[k-i];
}
}
}
for(int i=0;i<n;i++){
printf("%d%c",ans[i]," \n"[i==n-1]);
}
}
return 0;
}
#include<bits/stdc++.h>
using namespace std;
#define pii pair<int, int>
typedef long long ll;
const int maxn = 10105;
ll b[maxn];
int ans[55];
int main()
{
int t, n, m;
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &m);
for(int i = 0; i <= m; i++)
scanf("%I64d", &b[i]);
int cnt = 0;
for(int i = 1; i <= m; i++)
{
if(b[i] == 0) continue;
if(cnt == n) break;
ans[cnt++] = i;
for(int j = i; j <= m; j++)
b[j] -= b[j-i];
i--;
}
for(int i = 0; i < n; i++)
printf("%d%c", ans[i], i == n-1 ? '\n' : ' ');
}
return 0;
}