标签:case test [] text return sel .com different cal
如果 B?i?? 是 B 数组中除了 B?0?? 以外第一个值不为 0 的位置,那么显然 i 就是 A 中的最小数。
现在需要求出删掉 i 后的 B 数组,过程大概是反向的背包,即从小到大让 Bj-=B?(j−i)??。
时间复杂度 O(nm)。
1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstring> 5 #include<queue> 6 #include<cmath> 7 #include<string> 8 #include<map> 9 #include<vector> 10 using namespace std; 11 12 int b[10005];//最终结果b 13 int bb[10005];//目前得出的b 14 int a[10005]; 15 16 int main() 17 { 18 int T,n,m,ans; 19 scanf("%d",&T); 20 while(T--) 21 { 22 scanf("%d%d",&n,&m); 23 for(int i=0;i<=m;i++) 24 scanf("%d",&b[i]); 25 memset(a,0,sizeof(a)); 26 memset(bb,0,sizeof(bb)); 27 bb[0]=1; 28 for(int i=1;i<=m;i++) 29 { 30 a[i]=b[i]-bb[i]; 31 for(int j=1;j<=a[i];j++)//对bb进行更新 32 { 33 for(int k=m;k>=i;k--)//反着来避免已经加到结果里的数字再加一遍 34 bb[k]+=bb[k-i]; 35 } 36 } 37 int flag=0; 38 for(int i=1;i<=m;i++) 39 for(int j=1;j<=a[i];j++) 40 { 41 if(flag++) printf(" "); 42 printf("%d",i); 43 } 44 printf("\n"); 45 } 46 return 0; 47 }
HDU 6092 17多校5 Rikka with Subset(dp+思维)
标签:case test [] text return sel .com different cal
原文地址:http://www.cnblogs.com/Annetree/p/7325188.html