题面:给定n条直线,三线不公点,求交点可能的结果。
解析:转化为求下公式的所以可能。
a[i]为用i条线最多有多少交线,下文称价值。
因为存在i=1,没有交点,即有花费没有价值,若有满足条件的价值s,就可以出现x(x>s)。
用f[x]存满足用了n条线的最小价值和。
相当于完全背包,有一个n容量的背包,存在1……n种物品,价值a[i],每个物品无限多,求填满背包的最小价值。
代码: #include <bits/stdc++.h>
using namespace std;
int f[490000],n,t;
int ask[1000];
int main() {
scanf("%d",&t);
while(t--){
scanf("%d",&n);
ask[n]=1;
}
memset(f,0x3f3f3f3f,sizeof(f));
f[0]=0;
int m=700*700/2;
for(int i=1;i<=n;i++){
for(int j=0;j<=m-1;j++){
int k=j+i*(i-1)/2;
if(k<=m)
f[k]=min(f[k],f[j]+i);
}
if(ask[i]){
int mm=i*(i-1)/2;
for(int j=0;j<=mm;j++)
if(f[mm-j]<=i) printf("%d ",j);
printf("\n");
}
}
}


京公网安备 11010502036488号