您的位置:首页 > 大数据 > 人工智能

2017 Multi-University Training Contest - Team 5 :Rikka with Subset

2017-08-09 15:22 615 查看
题目链接

原文链接

贴个代码:

#include <iostream>
#include <stdio.h>
#include <string.h>

using namespace std;

const int maxn = 1e5;
int a[maxn];
int b[maxn];
int dp[maxn];
int main()
{
int t,n,m;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
memset(dp,0,sizeof(dp));
for(int i = 0; i <= m; i++)
scanf("%d",&b[i]);
int cnt = 0;
dp[0] = 1; ///dp[i]代表当前和为i的子集有多少个
for(int i = 0; i < m; i++)
{
int rest = b[i]-dp[i];
///dp[i]代表当前的a序列中子集和为dp[i]的个数。b[i]-dp[i]就是a序列中还要添加几个数字i
for(int j = 1; j <= rest; j++)
{
a[cnt++] = i; ///每添加一个i
for(int k = m; k >= i; k--) ///k-i这个数+i能构成k。
dp[k] += dp[k-i];
}
}
printf("%d",a[0]);
for(int i = 1; i < cnt; i++)
{
printf(" %d",a[i]);
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐