杭电10:Pty loves lines
题面:给定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"); } } }